首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个线性模型矩阵,其中一个范畴的每个级别都与平均值进行了比较。

一个线性模型矩阵,其中一个范畴的每个级别都与平均值进行了比较。
EN

Stack Overflow用户
提问于 2018-09-21 00:19:59
回答 1查看 50关注 0票数 0

我有xy数据,其中y是一个连续响应,x是一个分类变量:

代码语言:javascript
复制
set.seed(1)
df <- data.frame(y = rnorm(27), group = c(rep("A",9),rep("B",9),rep("C",9)), stringsAsFactors = F)

我想要拟合线性模型:y ~ group到它,在这个模型中,df$group中的每一个水平都与平均值进行对比。

我认为使用偏差编码可以做到这一点:

代码语言:javascript
复制
lm(y ~ group,contrasts = "contr.sum",data=df)

但它跳过了A组和平均值的对比:

代码语言:javascript
复制
> summary(lm(y ~ group,contrasts = "contr.sum",data=df))

Call:
lm(formula = y ~ group, data = df, contrasts = "contr.sum")

Residuals:
    Min      1Q  Median      3Q     Max 
-1.6445 -0.6946 -0.1304  0.6593  1.9165 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  -0.2651     0.3457  -0.767    0.451
groupB        0.2057     0.4888   0.421    0.678
groupC        0.3985     0.4888   0.815    0.423

Residual standard error: 1.037 on 24 degrees of freedom
Multiple R-squared:  0.02695,   Adjusted R-squared:  -0.05414 
F-statistic: 0.3324 on 2 and 24 DF,  p-value: 0.7205

是否有任何函数可以构建一个model matrix来获取与总结中的平均值形成对比的每个df$group级别?

我所能想到的就是手动向df$group添加一个“平均”级别,并将其设置为虚拟编码的基线。

代码语言:javascript
复制
df <- df %>% rbind(data.frame(y = mean(df$y), group ="mean"))
df$group <- factor(df$group, levels = c("mean","A","B","C"))
summary(lm(y ~ group,contrasts = "contr.treatment",data=df))

Call:
lm(formula = y ~ group, data = df, contrasts = "contr.treatment")

Residuals:
     Min       1Q   Median       3Q      Max 
-2.30003 -0.34864  0.07575  0.56896  1.42645 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  0.14832    0.95210   0.156    0.878
groupA       0.03250    1.00360   0.032    0.974
groupB      -0.06300    1.00360  -0.063    0.950
groupC       0.03049    1.00360   0.030    0.976

Residual standard error: 0.9521 on 24 degrees of freedom
Multiple R-squared:  0.002457,  Adjusted R-squared:  -0.1222 
F-statistic: 0.01971 on 3 and 24 DF,  p-value: 0.9961

类似地,假设我有两个分类变量的数据:

代码语言:javascript
复制
set.seed(1)
df <- data.frame(y = rnorm(18),
                 group = c(rep("A",9),rep("B",9)),
                 class = as.character(rep(c(rep(1,3),rep(2,3),rep(3,3)),2)))

我想估计每个级别的交互效应:(即class1:groupBclass2:groupBclass3:groupB用于:

代码语言:javascript
复制
lm(y ~ class*group,contrasts = c("contr.sum","contr.treatment"),data=df)

我怎样才能得到它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-21 00:22:57

+0公式中使用lm省略截距,然后得到预期的对比度编码:

代码语言:javascript
复制
summary(lm(y ~ 0 + group, contrasts = "contr.sum", data=df))

结果:

代码语言:javascript
复制
Call:
lm(formula = y ~ 0 + group, data = df, contrasts = "contr.sum")

Residuals:
    Min      1Q  Median      3Q     Max 
-2.3000 -0.3627  0.1487  0.5804  1.4264 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)
groupA  0.18082    0.31737   0.570    0.574
groupB  0.08533    0.31737   0.269    0.790
groupC  0.17882    0.31737   0.563    0.578

Residual standard error: 0.9521 on 24 degrees of freedom
Multiple R-squared:  0.02891,   Adjusted R-squared:  -0.09248 
F-statistic: 0.2381 on 3 and 24 DF,  p-value: 0.8689

如果您想在交互中这样做,有一种方法:

代码语言:javascript
复制
lm(y ~ 0 + class:group,
    contrasts = c("contr.sum","contr.treatment"), 
    data=df)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52434951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档