R语言lm()函数未显示全部世代分组数据问题求助
Signif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6.706 on 6726 degrees of freedom
Multiple R-squared: 0.02216, Adjusted R-squared: 0.02158
F-statistic: 38.11 on 4 and 6726 DF, p-value: < 2.2e-16
# 原因分析 这是R处理分类自变量的默认逻辑导致的: - 当字符型变量被纳入线性回归模型时,R会自动将其转换为**因子(factor)**类型,并默认使用**处理编码(treatment coding)**。 - 处理编码会选择一个组作为**参考组**,参考组的效应不会单独显示在系数表中,而是被整合到截距项(`(Intercept)`)里。其他组的系数代表该组与参考组的均值差异(控制其他自变量后)。 在你的案例中,`AgeGeneration`被转换为因子后,R按字符顺序排序水平:"Baby Boomers"(首字母B)排在"Gen X"、"Gen Z"、"Millenials"之前,因此被选为参考组。截距项`30.35`实际就是Baby Boomers组在睡眠时长为0时的预测BMI值,其他组的系数都是相对于Baby Boomers的差值。 你可以通过以下代码验证因子水平顺序: ```r levels(Database$AgeGeneration)
解决方法
如果需要显示Baby Boomers组的系数,或者更换参考组,可以通过以下方式实现:
1. 指定自定义参考组
使用relevel()函数修改因子的参考水平,例如将Gen Z设为参考组:
# 先转换为因子 Database$AgeGeneration <- factor(Database$AgeGeneration) # 指定Gen Z为参考组 Database$AgeGeneration <- relevel(Database$AgeGeneration, ref = "Gen Z") # 重新拟合模型 model <- lm(BMI ~ SleepHrsNight + AgeGeneration, data = Database) summary(model)
此时输出会显示Baby Boomers相对于Gen Z的系数。
2. 显式定义因子水平顺序
在创建世代分组时直接指定因子水平,避免默认的字符排序:
Database$AgeGeneration <- case_when( Database$Age >=10 & Database$Age <=25 ~ "Gen Z", Database$Age >=26 & Database$Age <=41 ~ "Millenials", Database$Age >=42 & Database$Age <=57 ~ "Gen X", Database$Age >57 ~ "Baby Boomers" ) %>% factor(levels = c("Gen Z", "Millenials", "Gen X", "Baby Boomers"))
这里第一个水平"Gen Z"会成为默认参考组,系数表中会显示其他三组相对于Gen Z的差异。
3. 使用总和编码显示所有组系数
如果想让每个组的系数代表其与整体均值的差异,可以设置总和编码:
Database$AgeGeneration <- factor(Database$AgeGeneration) # 设置总和编码(4个组对应4水平) contrasts(Database$AgeGeneration) <- contr.sum(4) # 拟合模型 model <- lm(BMI ~ SleepHrsNight + AgeGeneration, data = Database) summary(model)
这种编码方式下,所有组的系数都会显示,截距项代表所有组的平均BMI值。
内容的提问来源于stack exchange,提问作者folgoll
相关产品推荐
相关产品推荐

