Ниже приведен код R, который выполняет следующее: 1. Генерирует данные для линейной регрессии (4 предиктора, многовариантные нормальные данные на основе матрицы корреляции). 2. Выполняет 10-кратную перекрестную проверку с использованием каретки, предоставляя сводные результаты R2 * 3. Сопоставляет прогнозируемые значения во всех сгибах с фактическими значениями, а затем возводит их в квадрат, чтобы получить перекрестно проверенный R2 - это переменная 'ar2' в приведенном ниже коде.
* Итак, мой вопрос # 3 выше: почему бы просто не посчитать это? Вместо этого он сообщает R2 в каждом сгибе, объясняет изменчивость в R2 по сгибам и т. Д. c. Но если я хочу узнать общее прогнозирование вне выборки, основанное на перекрестном сгибе, кажется, что № 3 выше является более прямым.
# cross-validated linear regression
library(MASS)
library(caret)
# first generate random normal data
sigma <- matrix(c( 1, .35, .20, .10, .25,
.35, 1 , .15, .30, .30,
.20, .15, 1 , .40, .20,
.10, .30, .40, 1 , .35,
.25, .30, .20, .35, 1), ncol=5)
d <- mvrnorm(n = 100, rep(0, 5), sigma)
# label variables here
colnames(d) <- c(paste0("x", 1:4),"y")
# look at top of data set
head(d)
# generate means and correlations
apply(d,2,mean)
cor(d)
d <- as.data.frame(d)
# what if we used the whole sample, no cross-validation?
full <- lm(y ~ ., data = d)
summary(full)
# now let's look at cross-validated prediction
data_ctrl <- trainControl(method = "cv", number = 10, savePredictions="all") # folds for cross-validation
model_caret <- train(y ~ ., # model to fit - the dot means include all x's
data = d,
trControl = data_ctrl, # include the folds above
method = "lm") # specify linear regression
model_caret # results from cross-validation
# look at predictions for each fold
model_caret$resample
# summarized results
model_caret$results
# all data put into final model
summary(model_caret)
# what is the r2 between observed and predicted values?
# get the predicted values across folds
a <- model_caret$pred
# correlate actual and predicted values
ar2 <- cor(a[,1],a[,2])^2
ar2
# ...we can compare this r2 (ar2) from cross-validation to the r2 from the full model
# and get a direct sense of how r2 goes down under cross validation...right?