如何为回归结果数据框添加各模型样本量列?含缺失值场景疑问
问题解答
答案很明确:不会。
你当前代码里的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
相关产品推荐
相关产品推荐

