как выбрать переменные в линейной регрессии на основе значений в матрице с R

#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