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

如何为回归结果数据框添加各模型样本量列?含缺失值场景疑问

问题解答

答案很明确:不会。

你当前代码里的samplesize=nrow(mtcars)是直接取了整个数据集的总行数,完全没有考虑每个模型拟合时因为缺失值被自动排除的样本。lm()默认会用列表删除法(listwise deletion)去掉任何包含缺失值的观测,但你的代码没有捕捉到每个模型实际使用的样本量,只是硬编码了整个数据集的大小。

要获取每个模型的实际有效样本量,你需要从每个拟合好的模型对象中提取这个信息——broom包的glance()函数正好能帮你做到这一点,它返回的nobs字段就是模型实际用到的样本数。

这里给你修改后的代码,替换掉原来的样本量计算逻辑:

library(tidyverse)
library(broom)

outcomes <- c("wt", "mpg", "hp", "disp")
exposures <- c("gear", "vs", "am")
covariates <- c("drat", "qsec")

expand.grid(outcomes, exposures, covariates) %>%
  group_by(Var1, Var2) %>%
  summarise(Var3 = paste0(Var3, collapse = "+", .groups = "drop")) %>%
  rowwise() %>%
  summarise(frm = paste0(Var1, "~factor(", Var2, ")+", Var3)) %>%
  # 这里修改为拟合模型后同时提取tidy和glance结果
  rowwise(model_id = row_number()) %>%
  mutate(
    fit = list(lm(frm, data = mtcars)),
    tidy_fit = list(tidy(fit)),
    glance_fit = list(glance(fit))
  ) %>%
  # 展开tidy结果,同时关联glance里的样本量
  unnest(tidy_fit) %>%
  left_join(unnest(glance_fit), by = "model_id") %>%
  # 保留需要的列,把实际样本量nobs放在显眼位置
  select(model_id, frm, nobs, term, estimate, std.error, statistic, p.value) %>%
  ungroup()

这样修改后,nobs列就会显示每个模型在排除缺失值后的实际样本量了。如果你的数据里不同模型涉及的变量缺失情况不一样,每个模型的nobs可能会有差异,这才是真实的有效样本数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:51