#r #loops #regression #subset #store
#r #циклы #регрессия #подмножество #Магазин
Вопрос:
Я работаю с R.
У меня есть матрица, называемая комбинацией:
comb <- matrix( c(1,2,1,3,2,3) , nrow = 3 , ncol = 2)
n_comb<-3
У меня есть одноколоночный фрейм данных с именем y со значениями моей переменной y.
У меня есть фрейм данных с 3 столбцами, называемый reg, с 3 регрессорами.
Я хочу выполнить цикл, который регрессирует y по всем возможным комбинациям reg, выбирая каждый раз две переменные. Надеюсь, я смогу где-нибудь сохранить значения регрессии, чтобы потом я мог легко получить к ним доступ. Например, я хотел бы сохранить квадрат R каждой регрессии, а также используемые переменные x, связанные со значением квадрата R.
До сих пор я пытался:
for (i in 1:n_comb){
*reg_simple <- select only the variables I need*
all<-cbind (y,reg_simple)
colnames(all)[1] <- "y"
regression <-lm(y~.,all)
summary (regression)
*store the R square and the regressors somewhere*
}
`
Комментарии:
1. В чем важность
comb
? Просто предложение о том, как выполнять комбинации?2. Я использовал comb<-комбинации (n = 3, r = 2, v = 1: 9), чтобы получить этот вектор. Это всего лишь предложение о том, как это можно сделать.
Ответ №1:
Если мы хотим использовать предикторы на основе каждой строки «гребенки», перебираем строки матрицы «гребенки» (либо с apply/MARGIN = 1
помощью, либо с разделением по строкам ( asplit
— MARGIN = 1
) и цикл с sapply
), создаем формулу, используя reformulate
, применяем lm
и извлекаем r.squared
значения
rsquare_out <- sapply(asplit(comb, 1),
function(i) summary(lm(reformulate(names(reg)[i], response = 'y'),
data = cbind(reg, y)))$r.squared)
Ответ №2:
Использование циклов:
Фиктивные данные:
n = 100
y = rnorm(n)
x = data.frame(x1=1*y rnorm(n),
x2=2*y rnorm(n),
x3=3*y rnorm(n))
comb = gtools::combinations(3, 2)
Код:
regs = list()
for(i in 1:nrow(comb)){
mod = summary(lm(y ~ ., x[,comb[i,]]))
regs[[i]] = list(call=mod$terms[[3]],
coefs=mod$coefficients,
RS=mod$r.squared)}
Вы можете включить list()
в. Вывод:
> regs
[[1]]
[[1]]$call
x1 x2
[[1]]$coefs
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.03686327 0.04218032 0.8739449 3.843069e-01
x1 0.13359822 0.04037758 3.3087228 1.316050e-03
x2 0.36019362 0.02384050 15.1084733 3.143002e-27
[[1]]$RS
[1] 0.8384476
[[2]]
[[2]]$call
x1 x3
[[2]]$coefs
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.03390277 0.02660885 1.274116 2.056664e-01
x1 0.04295226 0.02654442 1.618128 1.088823e-01
x3 0.28556167 0.01064096 26.836090 1.110231e-46
[[2]]$RS
[1] 0.9356962
[[3]]
[[3]]$call
x2 x3
[[3]]$coefs
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0291651 0.02391629 1.219466 2.256244e-01
x2 0.1116096 0.02205835 5.059746 1.989407e-06
x3 0.2304448 0.01497633 15.387271 8.944792e-28
[[3]]$RS
[1] 0.9477506
Или вы можете использовать это для присвоения имен спискам с помощью вызова:
regs = list()
for(i in 1:nrow(comb)){
names = colnames(x)[comb[i,]]
mod = summary(lm(y ~ ., x[,names]))
regs[[paste(names, collapse=" ")]] = list(coefs=mod$coefficients,
RS=mod$r.squared)}
Вывод:
> regs
$`x1 x2`
$`x1 x2`$coefs
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.03686327 0.04218032 0.8739449 3.843069e-01
x1 0.13359822 0.04037758 3.3087228 1.316050e-03
x2 0.36019362 0.02384050 15.1084733 3.143002e-27
$`x1 x2`$RS
[1] 0.8384476
$`x1 x3`
$`x1 x3`$coefs
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.03390277 0.02660885 1.274116 2.056664e-01
x1 0.04295226 0.02654442 1.618128 1.088823e-01
x3 0.28556167 0.01064096 26.836090 1.110231e-46
$`x1 x3`$RS
[1] 0.9356962
$`x2 x3`
$`x2 x3`$coefs
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0291651 0.02391629 1.219466 2.256244e-01
x2 0.1116096 0.02205835 5.059746 1.989407e-06
x3 0.2304448 0.01497633 15.387271 8.944792e-28
$`x2 x3`$RS
[1] 0.9477506