1. ホーム
  2. r

[解決済み] lm()関数でleave-one-outクロスバリデーションを行う簡単なコマンドはありますか?

2022-02-03 11:52:52

質問

を使ったleave-one-outクロスバリデーションを行う簡単なコマンドはありますか? lm() という関数をRで使うか?

具体的には、以下のような簡単なコマンドがあるのでしょうか?

x <- rnorm(1000,3,2)
y <- 2*x + rnorm(1000)

pred_error_sq <- c(0)
for(i in 1:1000) {
  x_i <- x[-i]
  y_i <- y[-i]
  mdl <- lm(y_i ~ x_i) # leave i'th observation out
  y_pred <- predict(mdl, data.frame(x_i = x[i])) # predict i'th observation
  pred_error_sq <- pred_error_sq + (y[i] - y_pred)^2 # cumulate squared prediction errors
}

y_squared <- sum((y-mean(y))^2)/100 # Variation of the data

R_squared <- 1 - (pred_error_sq/y_squared) # Measure for goodness of fit

どのように解決するのですか?

もう一つの解決策は caret

library(caret)

data <- data.frame(x = rnorm(1000, 3, 2), y = 2*x + rnorm(1000))

train(y ~ x, method = "lm", data = data, trControl = trainControl(method = "LOOCV"))

線形回帰

1000 サンプル 1 予測器

前処理なし リサンプリング:Leave-One-Out Cross-Validation まとめ サンプルサイズ:999、999、999、999、999、・・・・。 リサンプリング の結果です。

RMSE Rsquared MAE
1.050268 0.940619 0.836808

チューニングパラメーター「intercept」はTRUEで一定とした