Сначала я создам воспроизводимый набор данных, поскольку вы не опубликовали ни одного.
set.seed(1) # make the results reproducible
n <- 100
X <- matrix(rnorm(6*n), ncol = 6)
y <- X %*% sample(6) + rnorm(n)
X <- as.data.frame(X)
names(X) <- paste0("x", 1:6)
data <- cbind(X, y)
head(data)
Следующее решает проблему в последовательных циклах *apply
.
Это происходит в следующих шагах.
- Получите полные имена регрессоров, зная только, что они начинаются с
"x"
.
- Создайте матрицу из всех возможных комбинаций два на два.
- Запустить все возможные регрессии в первом цикле
lapply
. Формула соединяется с paste
и затем приводится к классу "formula"
.
- Получите
summary
, где значение R ^ 2 вычисляется с другим lapply
.
- Вот и все. Теперь в этих двух списках есть вся необходимая информация, и стандартные операторы поднабора, такие как
'[['
, могут извлекать все, что нам нужно.
- R ^ 2 сначала извлекаются с
sapply
, поскольку они образуют вектор значений.
- Извлечение коэффициентов модели с максимальным значением R ^ 2 и резюме модели.
Итак, давайте сделаем это.
regress <- grep("^x", names(data), value = TRUE)
regress_mat <- combn(regress, 2)
lm_list <- apply(regress_mat, 2, function(reg){
fmla <- paste("y", paste(reg, collapse = "+"), sep = "~")
fmla <- as.formula(fmla)
lm(fmla, data)
})
smry_list <- lapply(lm_list, summary)
rsq <- sapply(smry_list, '[[', "r.squared")
coef(lm_list[[which.max(rsq)]])
#(Intercept) x3 x4
# -0.1400852 5.0556334 5.7352798
smry_list[[which.max(rsq)]]
#Call:
# lm(formula = fmla, data = data)
#
#Residuals:
# Min 1Q Median 3Q Max
#-11.6529 -4.6230 0.1127 3.7821 11.9342
#
#Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) -0.1401 0.5763 -0.243 0.808
# x3 5.0556 0.5626 8.987 2.07e-14 ***
# x4 5.7353 0.5867 9.775 4.11e-16 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 5.754 on 97 degrees of freedom
#Multiple R-squared: 0.6714, Adjusted R-squared: 0.6646
#F-statistic: 99.1 on 2 and 97 DF, p-value: < 2.2e-16