R语言提取多组多元线性回归系数及lmList报错排查
分组回归系数提取与lmList报错解决
一、用tidyverse+broom保留分组变量carb提取系数
你的原代码通过split()分组后丢失了carb的分组标识,改用group_by()+nest()的方式可以直接保留分组列,完整提取每个carb组的回归系数:
library(tidyverse) library(broom) df <- mtcars # 按carb分组嵌套,拟合模型后提取带分组标识的系数 result <- df %>% group_by(carb) %>% nest() %>% mutate(model = map(data, ~lm(mpg ~ cyl + hp + wt, data = .x)), tidied = map(model, tidy)) %>% unnest(tidied) %>% select(carb, term, estimate, p.value) # 按需保留结果列
运行后result会包含每个carb值对应的截距、各变量系数及统计量。
二、lmList报错"missing values in object"的解决
你提供的lmList代码使用了SentLength等mtcars不存在的变量,即使替换为正确公式(mpg ~ cyl + hp + wt | carb),仍会因为部分carb分组样本量不足报错:mtcars中carb=6和carb=8各只有1个样本,而你要拟合的模型包含3个自变量+截距,至少需要4个样本才能计算系数,这两个组无法拟合会产生NA,而lmList默认na.action=na.fail会触发缺失值报错。
有两种解决方式:
方法1:过滤样本量足够的分组
先筛选出样本数≥4的carb分组,再拟合模型:
library(nlme) # 保留样本量≥4的carb组 df_filtered <- df %>% group_by(carb) %>% filter(n() >= 4) %>% ungroup() fit <- lmList(mpg ~ cyl + hp + wt | carb, data = df_filtered) # 提取系数 coef(fit)
方法2:设置na.action跳过无法拟合的组
直接修改na.action参数,让lmList自动跳过无法拟合的分组:
library(nlme) fit <- lmList(mpg ~ cyl + hp + wt | carb, data = df, na.action = na.omit) # 提取系数 coef(fit)
内容的提问来源于stack exchange,提问作者ChrisMarini
相关产品推荐
相关产品推荐

