如何用线性回归匹配R中group_by多分组的均值计算结果?
问题背景
在R中构造如下数据集:
vec = c(200,300,400,500,600,100) char1 = c("a","a","a","b","b","a") char2 = c("c","c","d","c","d","d") df2 = tibble(vec,char1,char2);df2
输出结果:
# A tibble: 6 × 3 vec char1 char2 <dbl> <chr> <chr> 1 200 a c 2 300 a c 3 400 a d 4 500 b c 5 600 b d 6 100 a d
单分组计算均值时,dplyr的分组均值结果与不含截距的线性回归系数完全匹配:
按
char1分组:
分组均值代码:df2%>%group_by(char1)%>% summarise(mean(vec))对应线性回归写法:
lm(df2$vec~df2$char1-1)按
char2分组:
分组均值代码:df2%>%group_by(char2)%>% summarise(mean(vec))对应线性回归写法:
lm(df2$vec~df2$char2-1)
现在使用以下代码实现char1和char2的双分组均值计算:
df2%>%group_by(char1,char2)%>% summarise(mean(vec))
请问对应的线性回归等价写法是什么?
解答
要匹配双分组的均值结果,需要构建包含**char1与char2交互项**且不含截距的线性回归模型,具体写法有两种:
写法1:直接指定交互项
lm(vec ~ char1:char2 - 1, data = df2)
写法2:用*运算符(自动包含主效应+交互项,减去截距后主效应会被交互项覆盖,结果一致)
lm(vec ~ char1*char2 - 1, data = df2)
结果验证
双分组均值的输出结果为:
# A tibble: 4 × 3 char1 char2 `mean(vec)` <chr> <chr> <dbl> 1 a c 250 2 a d 250 3 b c 500 4 b d 600
而上述线性回归模型的系数输出为:
Coefficients: char1a:char2c char1a:char2d char1b:char2c char1b:char2d 250 250 500 600
两者完全对应。
注:使用data = df2参数是更规范的R代码风格,可避免重复写df2$的冗余写法。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

