如何用.lm.fit()提取R平方、调整R平方并实现预测?
关于.lm.fit()的R平方、调整R平方提取与预测功能实现
.lm.fit()作为底层拟合函数,确实比lm()更快,但返回的是包含核心拟合结果的列表而非标准lm模型对象。不过我们可以通过统计定义手动计算所需指标,同时实现预测功能,具体如下:
1. 计算R平方与调整R平方
依据R平方和调整R平方的数学定义,结合.lm.fit()返回的残差、样本信息即可计算:
set.seed(123) # 固定随机种子保证结果可复现 test_dat <- data.frame(y = rnorm(780, 20, 10)) for(b in 1:300){ name_var <- paste0("x",b) test_dat[[name_var]] <- rnorm(780, 0.01 * b, 5) } datm <- as.matrix(test_dat) y <- datm[,1] X <- cbind(1, datm[,-1]) # 构造带截距项的设计矩阵 obj_lm_fit <- .lm.fit(X, y) # 计算R平方 rss <- sum(obj_lm_fit$residuals^2) tss <- sum((y - mean(y))^2) r_squared <- 1 - (rss / tss) # 计算调整R平方 n <- length(y) p <- ncol(datm[,-1]) # 自变量个数 adj_r_squared <- 1 - ( (rss / (n - p - 1)) / (tss / (n - 1)) ) # 输出结果 cat("R平方:", r_squared, "\n") cat("调整R平方:", adj_r_squared, "\n")
你可以对比lm()的summary(obj_lm)$r.squared和summary(obj_lm)$adj.r.squared,二者结果完全一致。
2. 实现预测功能
预测的核心逻辑是用拟合系数乘以设计矩阵,无论训练数据还是新数据都可按此实现:
训练数据的预测
# 生成训练数据的预测值 pred_train <- X %*% obj_lm_fit$coefficients # 验证与lm()预测结果一致 all.equal(as.vector(pred_train), predict(obj_lm)) # 返回TRUE
新数据的预测
需先将新数据调整为与训练数据一致的格式,构造带截距的设计矩阵:
# 构造示例新数据(需包含所有300个自变量,此处仅展示部分) new_dat <- data.frame( x1 = rnorm(10, 0.01*1,5), x2 = rnorm(10,0.01*2,5) # 补全剩余298个自变量列 ) new_datm <- as.matrix(new_dat) new_X <- cbind(1, new_datm) # 添加截距项 # 生成新数据预测值 pred_new <- new_X %*% obj_lm_fit$coefficients pred_new
注意:新数据需与训练数据的自变量列名、顺序完全一致,否则会导致预测错误。
内容的提问来源于stack exchange,提问作者Jovan
相关产品推荐
相关产品推荐

