Я где-то закодировал это неправильно, потому что я получил NaN для MSE. Но я не могу на всю жизнь понять, где я ошибся. Все в первой части кода было дано мне как истинное (кроме n, H, j и dtrain). {m = 50 - размер тестового набора данных}. Затем мне сказали, что тренировочные данные должны иметь размер n = 50; и чтобы соответствовать линейным моделям и найти MSE для OLS, Ridge, & Lasso.
> library(glmnet)
> library(ISLR)
> set.seed(2018)
>m = 50
>**n = 50**
>p = 45
>rho = 0.7;
>Sigma = matrix(rho, p, p);
>diag(Sigma) = 1;
>X= MASS::mvrnorm(m, rep(0, p), Sigma);
>**H= MASS::mvrnorm(n, rep(0,p), Sigma);**
>beta0 = 10;
>num_nonzero = 45;
>beta = c(rep(1, num_nonzero), rep(0, p-num_nonzero));
>y = beta0+X%*%beta+rnorm(m);
>**j = beta0+H%*%beta+rnorm(n);**
>dtest = data.frame(y, X)
>**dtrain = data.frame(j, H)**
МНК
fit.lm <- lm(j ~ ., data = dtrain)
pred.lm <- predict(fit.lm, dtest)
mean((pred.lm - dtest$j)^2)
РИДЖ
train.mat <- model.matrix(j ~ ., data = dtrain)
test.mat <- model.matrix(y ~ ., data = dtest)
grid <- 10 ^ seq(10, -2, length = 100)
fit.ridge <- glmnet(train.mat, dtrain$j, alpha = 0, lambda = grid, thresh = 1e-12)
cv.ridge <- cv.glmnet(train.mat, dtrain$j, alpha = 0, lambda = grid, thresh = 1e-12)
bestlam.ridge <- cv.ridge$lambda.min
bestlam.ridge
pred.ridge <- predict(fit.ridge, s = bestlam.ridge, newx = test.mat)
mean((pred.ridge - dtest$j)^2)
ЛАССО
fit.lasso <- glmnet(train.mat, dtrain$j, alpha = 1, lambda = grid, thresh = 1e-12)
cv.lasso <- cv.glmnet(train.mat, dtrain$j, alpha = 1, lambda = grid, thresh = 1e-12)
bestlam.lasso <- cv.lasso$lambda.min
bestlam.lasso
pred.lasso <- predict(fit.lasso, s = bestlam.lasso, newx = test.mat)
mean((pred.lasso - dtest$j)^2)