修改R中lm模型系数后无法计算新结果的问题求助
问题原因
直接修改fit1$coefficients只是改动了模型对象里存储的系数值,但summary()用到的多重R平方、拟合值、残差等统计量,都是模型初次拟合时就计算好并存在lm对象里的(比如fitted.values、residuals、r.squared这些属性),不会因为你改了系数就自动重新计算。所以哪怕系数变了,summary调用的还是原来的旧统计量,结果自然一致。
解决方法
要拿到修改系数后的模型结果,得手动计算相关统计量,或者更新模型对象里的依赖项,下面是两种可行方式:
方式1:手动计算核心指标
如果只需要拟合值、残差、R平方这些关键指标,直接基于新系数计算就行:
# 提取带截距项的设计矩阵 X <- model.matrix(fit1) # 用新系数算拟合值 fit1$fitted.values <- X %*% fit1$coefficients # 计算残差 fit1$residuals <- fit1$model$y - fit1$fitted.values # 计算R平方:1 - (残差平方和/总平方和) ss_res <- sum(fit1$residuals^2) ss_tot <- sum((fit1$model$y - mean(fit1$model$y))^2) fit1$r.squared <- 1 - ss_res / ss_tot # 计算调整R平方 n <- nrow(X) k <- length(fit1$coefficients) fit1$adj.r.squared <- 1 - (ss_res/(n - k)) / (ss_tot/(n - 1))
之后再调用summary(fit1),就能看到更新后的R平方等指标了。
方式2:重新构造模型对象(更彻底)
如果想让summary里的所有统计量都更新,可以用lm.fit()重新构造模型,手动传入设计矩阵和响应变量:
# 提取设计矩阵和响应变量 X <- model.matrix(fit) y <- fit$model$y # 用lm.fit初始化模型对象 fit1 <- lm.fit(X, y) # 设置你想要的新系数 fit1$coefficients <- c(fit$coefficients[1], 5, 1) # 重新计算拟合值、残差 fit1$fitted.values <- X %*% fit1$coefficients fit1$residuals <- y - fit1$fitted.values # 添加必要属性让summary正常显示 fit1$rank <- fit$rank fit1$df.residual <- fit$df.residual fit1$call <- fit$call
这样处理后,summary(fit1)就能展示基于新系数的完整统计结果。
注意事项
- lm对象是个存了大量预计算统计量的列表,改其中一项不会触发其他项自动更新,必须手动重新计算依赖指标。
- 如果要算t值、p值这类统计量,得基于新系数和模型方差协方差矩阵重新算,但这些指标在修改系数后已经失去原有的统计意义(它们是基于原拟合的抽样分布得出的),如果只是对比拟合效果,重点看拟合值、R平方、残差就够了。
内容的提问来源于stack exchange,提问作者ToniNA
相关产品推荐
相关产品推荐

