在运行以下代码时:# 50*30, 30个变量 set.seed(1) X = matrix(rnorm(1500), nrow = 50, ncol = 30) Y = rnorm(50) # 原始模型为线性,给出三组不同的原始模型系数 lm.fit1 = lm(Y ~ X[,1]) lm.fit2 = lm(Y ~ X[,1:15]) lm.fit3 = lm(Y ~ X)。出现了以下错误:Error in model.frame.default(formula = Y ~ X[, 1], data = list(Y = c(0.850043471893941, : 变数的长度不一样('X[, 1]'),rror in model.frame.default(formula = Y ~ X[, 1:15], data = list(Y = c(0.850043471893941, : 变数的长度不一样('X[, 1:15]')。请对原代码进行修改
时间: 2024-01-24 15:04:46 浏览: 71
这个错误是因为在lm()函数中使用了不同长度的X和Y,导致无法匹配。可以通过将X和Y放到同一个data.frame中来解决这个问题。修改后的代码如下:
```R
# 50*30, 30个变量
set.seed(1)
X = matrix(rnorm(1500), nrow = 50, ncol = 30)
Y = rnorm(50)
data = data.frame(Y, X)
# 原始模型为线性,给出三组不同的原始模型系数
lm.fit1 = lm(Y ~ X[,1], data = data)
lm.fit2 = lm(Y ~ X[,1:15], data = data)
lm.fit3 = lm(Y ~ X, data = data)
# 计算CV值
library(boot)
cv.error1 = cv.glm(data[,c("Y", "X[,1]")], lm.fit1)$delta[1]
cv.error2 = cv.glm(data[,c("Y", paste0("X[,",1:15,"]"))], lm.fit2)$delta[1]
cv.error3 = cv.glm(data[,c("Y", paste0("X[,",1:30,"]"))], lm.fit3)$delta[1]
# 画出CV error图和Prediction error图
par(mfrow=c(1,2))
plot(1:3, c(cv.error1, cv.error2, cv.error3), type = "b", xlab = "Model Complexity", ylab = "CV Error")
pred.error1 = sqrt(mean((Y - predict(lm.fit1, data)) ^ 2))
pred.error2 = sqrt(mean((Y - predict(lm.fit2, data)) ^ 2))
pred.error3 = sqrt(mean((Y - predict(lm.fit3, data)) ^ 2))
plot(1:3, c(pred.error1, pred.error2, pred.error3), type = "b", xlab = "Model Complexity", ylab = "Prediction Error")
# 基于一倍标准差准则给出参数值上限
upper.bound = mean(Y) + sd(Y)
```
在计算CV值和Prediction error时,需要将data.frame传递给cv.glm()和predict()函数。
阅读全文