You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用线性回归匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:05:44