линейная регрессия: сравнение R2 в полной модели с R2 при перекрестной проверке в k-кратном выражении - PullRequest
0 голосов
/ 22 января 2020

Ниже приведен код 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?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...