如何将lm模型summary输出中的spray1~5改为对应真实水平sprayB~F?
问题解决:将lm回归系数中的spray15改为sprayBF
原因分析
当使用contr.sum对比编码时,R默认会给因子的对比矩阵列命名为1、2……k-1(k为因子水平数),因此回归输出的系数会显示为spray1至spray5,而非对应的因子水平名(B-F)。他人能显示字母水平名,是因为手动指定了对比矩阵的列名。
解决方案
方法一:提前修改因子的对比矩阵列名(推荐)
在拟合模型前,手动设置spray因子的对比矩阵,并将列名替换为对应的水平名(B-F):
options(contrasts = c("contr.sum", "contr.poly")) require(datasets); data(InsectSprays) # 获取除第一个水平(A)外的所有水平名 target_levels <- levels(InsectSprays$spray)[-1] # 设置contr.sum对比矩阵,并重命名列 contrasts(InsectSprays$spray) <- contr.sum(nlevels(InsectSprays$spray)) colnames(contrasts(InsectSprays$spray)) <- target_levels # 拟合模型并查看结果 model1 <- lm(count ~ spray, data = InsectSprays) summary(model1)
此时输出的系数会显示为sprayB、sprayC、sprayD、sprayE、sprayF,对应各水平与整体均值的差异。
方法二:拟合后修改模型系数名(临时显示用)
如果仅需修改显示效果,可在拟合模型后直接替换系数的名称:
options(contrasts = c("contr.sum", "contr.poly")) require(datasets); data(InsectSprays) model1 <- lm(count ~ spray, data = InsectSprays) # 替换系数名 coef_names <- names(coef(model1)) coef_names[grepl("spray", coef_names)] <- paste0("spray", levels(InsectSprays$spray)[-1]) names(coef(model1)) <- coef_names # 查看修改后的结果 summary(model1)
该方法仅改变显示名称,不影响模型的计算逻辑。
内容的提问来源于stack exchange,提问作者littletennis
相关产品推荐
相关产品推荐

