Цикл регрессии: создание термина взаимодействия, сохранение результатов, извлечение только значимых - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть набор данных

auto <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Auto.csv")

, в котором я пытаюсь найти какие-либо существенные условия взаимодействия.Я хочу регрессии, которые включают только одно взаимодействие плюс составляющие его термины (т.е. цилиндры + ускорение + цилиндры: ускорение - это одна регрессия, которую я хочу проверить).

До сих пор, используя другие вопросы Stackoverflow, я смогчтобы придумать это:

results <- NULL
vars=colnames(auto)[-c(1,9)]
for(i in vars){
for(j in vars){
if(i ! = j){
factor=paste(i,j,sep='*')}
for(k in 1:20){
results[[k]]<-summary(lm(paste("mpg~", factor), data=auto)))
}}}

Тем не менее, это постоянно создает список, в котором хранится только последнее взаимодействие (т.е. коэффициенты для происхождения * год).Я также был бы в порядке, если бы код не содержал только уникальные значения, а также квадратные версии терминов.Однако, так как два из них (последние два в списке, происхождение и год) не заслуживают возведения в квадрат, и, поскольку я не знаю, как разделить длины для i и j и заставить их работать, я оставил это вне.

Что я должен сделать, чтобы получить результаты, которые я хочу получить из этого цикла?Должен ли я идти об этом по-другому?Я также попытался создать все взаимодействия, а затем добавить их в информационный фрейм и запустить цикл через него, но он, похоже, не является более эффективным / возможным.

1 Ответ

0 голосов
/ 15 февраля 2019

Ваш цикл k не имеет другого эффекта, кроме сохранения результата в списке длиной 20. Все значения будут идентичны, и у вас останется сводка последней комбинации i*j.Я бы предварительно вычислил комбинации, создал список для каждой и передал их в один цикл.

Обратите внимание, что набор данных mtcars уже отправлен с R.

vars <- colnames(mtcars)[-1]

# Prepare combinations of variables.
combos <- combn(vars, 2, simplify = FALSE)
combos <- sapply(combos, FUN = paste, collapse = "*")

# For each combination, create a formula object and use it in the regression.
# It would be prudent to include the data object into function argument.
results <- lapply(combos, FUN = function(x) {
  frm <- as.formula(paste("mpg ~ ", x))
  summary(lm(frm, data = mtcars))
})

# Rename results names for pretty purposes.
names(results) <- combos

> results[1]
$`cyl*disp`

Call:
lm(formula = frm, data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.0809 -1.6054 -0.2948  1.0546  5.7981 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 49.037212   5.004636   9.798 1.51e-10 ***
cyl         -3.405244   0.840189  -4.053 0.000365 ***
disp        -0.145526   0.040002  -3.638 0.001099 ** 
cyl:disp     0.015854   0.004948   3.204 0.003369 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.66 on 28 degrees of freedom
Multiple R-squared:  0.8241,    Adjusted R-squared:  0.8052 
F-statistic: 43.72 on 3 and 28 DF,  p-value: 1.078e-10
...