You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R语言中用统计模型复现分组均值计算结果

用统计模型复现R语言中分组均值的计算结果

没问题!我来帮你用统计模型复现你用aggregate算出的分组均值结果。先从构造示例数据开始,方便我们一起验证:

# 构造你提供的数据集
dat <- data.frame(
  EXIST = c(0, 0, 0, 1, 0),
  DATE = c("10/2015", "01/2016", "01/2014", "05/2015", "11/2015"),
  VAR1 = c(6, 6, 5, 5, 6),
  VAR2 = c(4, 4, 4, 4, 4)
)

首先,先运行你原来的aggregate代码,确认基准结果:

# 你的原分组均值计算代码
ag <- data.frame(as.matrix(aggregate(EXIST ~ VAR1 + VAR2, data = dat, function(x) c(mean = mean(x)))))
print(ag)
# 输出结果:
#   VAR1 VAR2 EXIST.mean
# 1    5    4        0.5
# 2    6    4        0.0

接下来,我们用**线性模型(lm)**来复现这个结果。因为你要的是VAR1VAR2组合分组下EXIST的均值,而EXIST是0/1二分类变量,分组均值本质上就是每个组的“事件发生概率”,线性模型可以直接拟合出这个均值。

方法1:使用交叉项去掉全局截距

我们可以把VAR1VAR2转为因子,拟合包含它们交叉项且无全局截距的模型,这样每个系数就对应一个分组的均值:

# 拟合线性模型
model <- lm(EXIST ~ factor(VAR1)*factor(VAR2) - 1, data = dat)
# 提取系数并整理成数据框
model_results <- data.frame(
  VAR1 = as.integer(sub("factor\\(VAR1\\)", "", names(coef(model)))),
  VAR2 = as.integer(sub(".*factor\\(VAR2\\)", "", names(coef(model)))),
  EXIST_mean = coef(model)
)
print(model_results)
# 输出结果和aggregate完全一致:
#   VAR1 VAR2 EXIST_mean
# 1    5    4        0.5
# 2    6    4        0.0

方法2:使用interaction函数

如果你觉得交叉项写法有点繁琐,也可以用interaction()函数直接生成分组变量,同样去掉全局截距:

# 用interaction构造分组变量
model2 <- lm(EXIST ~ interaction(VAR1, VAR2) - 1, data = dat)
# 整理结果
model2_results <- data.frame(
  group = names(coef(model2)),
  EXIST_mean = coef(model2)
)
# 拆分group列得到VAR1和VAR2
model2_results$VAR1 <- as.integer(sapply(strsplit(as.character(model2_results$group), "\\."), "[", 1))
model2_results$VAR2 <- as.integer(sapply(strsplit(as.character(model2_results$group), "\\."), "[", 2))
# 调整列顺序
model2_results <- model2_results[, c("VAR1", "VAR2", "EXIST_mean")]
print(model2_results)
# 同样得到和aggregate一致的结果

补充:二分类变量的广义线性模型(glm)

如果你的数据量更大或者想考虑二分类变量的分布特性,也可以用glmidentity链接来拟合,结果和lm完全一致:

glm_model <- glm(EXIST ~ factor(VAR1)*factor(VAR2) - 1, data = dat, family = binomial(link = "identity"))
print(coef(glm_model))
# 系数同样是0.5和0.0,和之前的结果匹配

这样就完美复现了你用aggregate得到的分组均值结果啦!

内容的提问来源于stack exchange,提问作者Maximilian

火山引擎 最新活动