未先调用summary时lm模型系数缺失Pr列的原因及访问方法问询
问题描述
用户在用R做线性回归时遇到了奇怪的问题:运行下面的代码时,要是把summary(fit.all)这行注释掉,后面用coef(summary(fit.all))拿到的结果里就没了p值(Pr列);现在用户能拿到系数对象,但不知道怎么从中取出p值。
初始代码:
fit.all <- lm(target ~ ., train ) summary(fit.all) # 若注释掉该行,coefs将不包含P值 coef(summary(fit.all)) -> coefs print(coefs)
后续尝试的代码:
coef(summary(fit.all)) -> fit.all.summary.coef str(fit.all.summary.coef) class(fit.all.summary.coef)
原因与解决办法
为啥注释掉summary(fit.all)就没p值?
R里lm()生成的模型对象本身不会提前计算好p值,p值是调用summary()的时候才会计算出来,并且缓存到模型对象的$summary属性里。第一次运行summary(fit.all)时,R会把所有统计量(包括p值)计算完成并存储;要是跳过这一步,后续调用coef(summary(fit.all))时,虽然也会触发summary()计算,但在旧版R或特定环境缓存异常的情况下,可能出现p值列未正确生成的问题。
怎么稳定获取并访问p值?
不管有没有提前运行summary(),都可以用以下方法靠谱获取p值:
- 分步操作更清晰:
# 生成模型的摘要对象 fit_summary <- summary(fit.all) # 提取系数矩阵 coef_matrix <- fit_summary$coefficients # 直接提取Pr(>|t|)列,这就是所需的p值 p_values <- coef_matrix[, "Pr(>|t|)"] - 一步到位更简洁:
p_values <- coef(summary(fit.all))[, "Pr(>|t|)"]
另外,通过str(fit.all.summary.coef)可以看到,这个系数对象是矩阵(或数据框)结构,列名包含Pr(>|t|),直接通过列名或列索引(通常是第4列)就能访问:
# 推荐用列名,避免列顺序变动导致出错 fit.all.summary.coef[, "Pr(>|t|)"] # 也可以用列索引(注意:不同模型的列顺序可能有变化,优先用列名) fit.all.summary.coef[, 4]
内容的提问来源于stack exchange,提问作者Kirsten
相关产品推荐
相关产品推荐

