You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复现《统计学习导论:基于R应用》6.5.3节实验结果遇问题

复现《统计学习导论:基于R应用》6.5.3节实验的完整代码与问题解决

我正在尝试复现《统计学习导论:基于R应用》(An Introduction to Statistical Learning with Applications in R)6.5.3节的实验结果,已经严格按照书中代码操作,但代码还没完成,请求协助完成并解决相关问题。

已编写的代码片段

library("ISLR")
library("leaps")
set.seed(1)
train = sample(c(TRUE, FALSE), nrow(Hitters), rep = TRUE)
test = (!train)
regfit.best = regsubsets(Salary ~., data = Hitters[train,], nvmax= 19)
test.mat = model.matrix(Salary~., data = Hitters[test,])
val.errors = rep(NA, 19)
for (i in 1:19){ coefi= coef(regfit.be...

完整代码与步骤解释

首先要注意,原书中第一步是去除缺失值,这很容易被忽略,否则后续分析会出现问题。下面是补全并修正后的完整代码:

# 1. 加载所需包
library("ISLR")
library("leaps")

# 2. 去除数据中的缺失值(原书中关键步骤,不可省略)
Hitters = na.omit(Hitters)

# 3. 设置随机种子保证结果可复现
set.seed(1)

# 4. 拆分训练集与测试集
train = sample(c(TRUE, FALSE), nrow(Hitters), rep = TRUE)
test = (!train)

# 5. 在训练集上训练所有可能的子集模型(最多19个预测变量)
regfit.best = regsubsets(Salary ~., data = Hitters[train,], nvmax= 19)

# 6. 构造测试集的模型矩阵,用于后续预测计算
test.mat = model.matrix(Salary~., data = Hitters[test,])

# 7. 循环计算每个变量数模型的验证集MSE
val.errors = rep(NA, 19)
for (i in 1:19) {
  # 提取包含i个变量的最优模型系数
  coefi = coef(regfit.best, id = i)
  # 计算测试集预测值(匹配系数对应的特征列)
  pred = test.mat[, names(coefi)] %*% coefi
  # 计算该模型的验证集均方误差
  val.errors[i] = mean((Hitters$Salary[test] - pred)^2)
}

# 8. 找到MSE最小的模型对应的变量数
best_model_size = which.min(val.errors)
cat("最优模型的变量数:", best_model_size, "\n")

# 9. 查看最优模型的系数
coef(regfit.best, id = best_model_size)

常见问题解决

  • 缺失值问题:如果跳过na.omit(Hitters),Hitters数据集中的缺失Salary值会导致regsubsets无法正常运行,或者得到错误结果
  • 循环中系数提取错误:必须用coef(regfit.best, id = i)指定提取包含i个变量的最优模型,否则默认提取所有变量的模型
  • 预测值计算错误:test.mat[, names(coefi)]确保只选取系数对应的特征列,避免维度不匹配的报错

内容的提问来源于stack exchange,提问作者Ardyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:12:54