r语言生成50*30,30个随机变量 ,原始模型为线性 ,给出三组不同的原始模型系数 ,进行岭回归计算出CV值画出cv error图和prediction error图
时间: 2024-03-07 20:46:56 浏览: 118
好的,以下是用 R 语言实现的代码:
首先生成随机的数据集:
```r
set.seed(123)
n <- 50
p <- 30
X <- matrix(rnorm(n*p), n, p)
y <- rnorm(n)
```
接下来,我们将定义一个函数,用于执行岭回归:
```r
ridge_regression <- function(X, y, alpha) {
n <- nrow(X)
p <- ncol(X)
X <- scale(X, center = TRUE, scale = FALSE)
y <- scale(y, center = TRUE, scale = TRUE)
X <- cbind(1, X)
lambda <- alpha * sqrt(p)
XtX <- t(X) %*% X
beta_hat <- solve(XtX + lambda * diag(p+1)) %*% t(X) %*% y
return(beta_hat)
}
```
现在我们需要定义三个不同的原始模型系数:
```r
beta_1 <- c(1, rep(0, p))
beta_2 <- c(1, rep(c(1, -1), p/2))
beta_3 <- c(1, 1:p)
```
接下来,我们可以使用 10 折交叉验证来计算岭回归的 CV 值和预测误差:
```r
library(caret)
library(ggplot2)
# 定义 alpha 的范围
alphas <- seq(0, 1, by = 0.01)
n_alphas <- length(alphas)
# 岭回归的 CV 值和预测误差
cv_errors <- matrix(0, n_alphas, 3)
pred_errors <- matrix(0, n_alphas, 3)
for (i in 1:n_alphas) {
alpha <- alphas[i]
for (j in 1:3) {
if (j == 1) {
beta <- beta_1
} else if (j == 2) {
beta <- beta_2
} else if (j == 3) {
beta <- beta_3
}
y_hat <- X %*% beta
y_noise <- y_hat + rnorm(n)
beta_ridge <- ridge_regression(X, y_noise, alpha)
y_pred <- X %*% beta_ridge
cv_errors[i, j] <- cv.glmnet(X, y_noise, alpha = alpha, nfolds = 10)$cvm
pred_errors[i, j] <- mean((y_pred - y_hat)^2)
}
}
# 画出 cv error 图和 prediction error 图
cv_df <- data.frame(alpha = rep(alphas, 3), error = c(cv_errors), model = rep(c("Model 1", "Model 2", "Model 3"), each = n_alphas))
ggplot(cv_df, aes(x = alpha, y = error, color = model)) + geom_line() + ggtitle("CV Error")
pred_df <- data.frame(alpha = rep(alphas, 3), error = c(pred_errors), model = rep(c("Model 1", "Model 2", "Model 3"), each = n_alphas))
ggplot(pred_df, aes(x = alpha, y = error, color = model)) + geom_line() + ggtitle("Prediction Error")
```
以上代码将会计算出三个不同的模型系数下的岭回归 CV 值和预测误差,并画出相应的 CV Error 图和 Prediction Error 图。
阅读全文