Цикл, который генерирует все возможные линейные модели и заменяет имя зависимой переменной значением из списка

#r #loops #foreach #linear-regression

#r #петли #заранее #линейная регрессия #циклы #foreach

Вопрос:

Итак, я хочу протестировать все возможные модели линейной регрессии, доступные с 1-5 независимыми переменными и одной из 18 зависимых переменных. У меня есть код, работающий для генерации всех моделей линейной регрессии с 1-й зависимой переменной и 5 независимыми, но я не уверен, как запустить этот код для каждой из 18 зависимых переменных, которые я хочу проверить.

GClist <- data.frame(GC1, GC2, GC3, GC4, GC5, GC6, GC7, GC8, GC9, GC10, GC11, GC12, GC13, GC14, GC15, GC16, GC17, GC18)

До сих пор я составлял список из 18 DV, я также пытался выполнить цикл, используя цикл foreach, а затем пытался проанализировать список, содержащий 18 имен DV.

Я пытался использовать:

 for(value in GClist)
{
the code below
}
// but then I did not manage to make it work and include the "value" in the code

// I also tried to use foreach, but I using df[j] and having df containing all my 18 dependent variables did not seem to work.


foreach (j=1:18) %do% {the code below }
  

В любом случае, код, который работает, это:

 df1 <- data.frame(GC1, D1, D2, D3, D4, D5)
library(foreach)

#create the linear models list 

xcomb <- foreach(i=1:5, .combine=c) %do% {combn(names(df1)[-1], i, simplify=FALSE) }
formlist <- lapply(xcomb, function(l) formula(paste(names(df1), paste(l, collapse=" "), sep="~")))```

 # get the p value for each model
models.p <- sapply(formlist, function (i)  {
  f <- summary(lm(i))$fstatistic
  p <- pf(f[1],f[2],f[3],lower.tail=F)
  attributes(p) <- NULL
  return(p)
})
# R squared for each model
models.r.sq <- sapply(formlist, function(i) summary(lm(i))$r.squared)
# adjusted R squared for each model
models.adj.r.sq <- sapply(formlist, function(i) summary(lm(i))$adj.r.squared)
# MSEp squared for each model
models.MSEp <- sapply(formlist, function(i) anova(lm(i))['Mean Sq']['Residuals',])

# Full model MSE for each linear model
MSE <- anova(lm(formlist[[length(formlist)]]))['Mean Sq']['Residuals',]

# Mallow's Cp - skipped for now 

df.model.eval <- data.frame(model=as.character(formlist), pF=models.p,
                            r.sq=models.r.sq, adj.r.sq=models.adj.r.sq, MSEp=models.MSEp)
  

Как я могу запустить этот код для каждой из 18 зависимых переменных, чтобы я мог собрать всю информацию в df.model.eval? Прямо сейчас у меня есть все, что мне нужно знать о моделях, которые используют GC1 в качестве зависимой переменной. Моя цель — просмотреть все модели (от GC1 до GC18) и выделить все, которые имеют статистическую значимость, и те, которые этого не делают.

Комментарии:

1. «выделите все, что имеет статистическую значимость, и те, которые не имеют» Я надеюсь, что вы, по крайней мере, скорректируете p-значения, если вам вообще нужно это делать. Похоже, вы занимаетесь извлечением данных .

2. @Roland Действительно, может показаться, что это так. Однако я заранее сформулировал свою гипотезу и определенно продолжу исследования по корректировке своих p-значений, чтобы избежать представления нерелевантных данных. Чтобы дать вам некоторый контекст, я проверяю, являются ли пять основных областей личности предикторами принятия определенных (18) категорий подарков. Для меня также важен скорректированный квадрат R, а также запуск ANOVA на нескольких моделях, так что я устанавливаю силу прогнозирования каждой модели, а не только статистическую значимость.

Ответ №1:

Мне удалось это сделать, создав фрейм данных с возможными DVS;

GC <- data.frame(GC1, GC2, GC3, GC4, GC5, GC6, GC7, GC8, GC9, GC10, GC11, GC12, GC13, GC14, GC15, GC16, GC17, GC18)

Затем, используя код Джорджа Донтаса, найденный в https://stats.stackexchange.com/a/6862 , Я готовлю свой первый фрейм данных для генерации моделей линейной регрессии.

 library(foreach)

finallist <- list()
xcomb <- foreach(i=1:5, .combine=c) %do% {combn(names(df1)[-1], i, simplify=FALSE) }
  

Я заменяю первый элемент моего фрейма данных здесь:

 for(j in c(names(GC)))
{
  names(df1)[1] <- j #switch DVs
  #George's code to create a list with all the possible combinations of the DV and the IVs
  formlist <- lapply(xcomb, function(l) formula(paste(names(df1), paste(l, collapse=" "), sep="~"))) 
  #append the list of linear regression models for each DV to the main list
  finallist <- append(finalist, formlist)
}
  

Теперь у меня есть список всех моделей линейной регрессии, которые я затем могу использовать для оценки и интерпретации соответствующих статистических показателей, с
как.character(финалист)

Мой окончательный код:

 df1 <- data.frame(GC1, D1, D2, D3, D4, D5)
library(foreach)
library(rlist)
finallist <- list()
xcomb <- foreach(i=1:5, .combine=c) %do% {combn(names(df1)[-1], i, simplify=FALSE) }

#iterate through DV names
for(j in c(names(GC)))
{
  names(df1)[1] <- j #switch DVs (I know 1st step replaces same DV name)
  #create a list with all the possible combinations of the DV and the IVs
  formlist <- lapply(xcomb, function(l) formula(paste(names(df1), paste(l, collapse=" "), sep="~"))) 
  #append the list of linear regression models for each DV to the main list
  finallist <- append(finalist, formlist)
}

# get the p value for each model
models.p <- sapply(formlist, function (i)  {
  f <- summary(lm(i))$fstatistic
  p <- pf(f[1],f[2],f[3],lower.tail=F)
  attributes(p) <- NULL
  return(p)
})
# R squared for each model
models.r.sq <- sapply(finallist, function(i) summary(lm(i))$r.squared)
# adjusted R squared for each model
models.adj.r.sq <- sapply(finallist, function(i) summary(lm(i))$adj.r.squared)
# MSEp squared for each model
models.MSEp <- sapply(finallist, function(i) anova(lm(i))['Mean Sq']['Residuals',])

# Full model MSE for each linear model
MSE <- anova(lm(finallist[[length(finallist)]]))['Mean Sq']['Residuals',]

# Mallow's Cp - skipped for now 

df.model.eval <- data.frame(model=as.character(finallist), pF=models.p,
                            r.sq=models.r.sq, adj.r.sq=models.adj.r.sq, MSEp=models.MSEp)