Я хочу написать цикл в R для запуска нескольких регрессий с одной зависимой переменной и двумя списками независимых переменных (все непрерывные переменные).Модель является аддитивной, и цикл должен выполняться путем итерации по двум спискам переменных, чтобы она брала первый столбец из первого списка + первый столбец из второго списка, затем то же самое для второго столбца в двух списках и т. Д.Проблема в том, что я не могу заставить его правильно перебирать списки, вместо этого мой цикл запускает больше моделей, чем должен.
Фрейм данных, который я здесь описываю, является лишь подмножеством, которое мне фактически нужно будет выполнить 3772 раза (я работаю над выражением транскрипта RNA-seq).
Мой фрейм данных называется сухим и содержит 22 переменных (столбцы) и 87 наблюдений (строки).Столбец 1 содержит genotypeID, столбец 2:11 содержит один набор независимых переменных для итерации, столбец 12:21 содержит второй набор независимых переменных для итерации, а столбец 23 содержит мою зависимую переменную под названием FITNESS_DRY.Вот как выглядит структура:
str(dry)
'data.frame': 87 obs. of 22 variables:
$ geneID : Factor w/ 87 levels "e10","e101","e102",..: 12 15 17 24 25 30 35 36 38 39 ...
$ RDPI_T1 : num 1.671 -0.983 -0.776 -0.345 0.313 ...
$ RDPI_T2 : num -0.976 -0.774 -0.532 -1.137 1.602 ...
$ RDPI_T3 : num -0.197 -0.324 0.805 -0.701 -0.566 ...
$ RDPI_T4 : num 0.289 -0.92 1.117 -1.214 -0.447 ...
$ RDPI_T5 : num -0.671 1.963 NA -1.024 -0.295 ...
$ RDPI_T6 : num 2.606 -1.116 -0.383 -0.893 0.119 ...
$ RDPI_T7 : num -0.843 -0.229 -0.297 0.504 -0.712 ...
$ RDPI_T8 : num -0.227 NA NA -0.816 -0.761 ...
$ RDPI_T9 : num 0.754 -1.304 1.867 -0.514 -1.377 ...
$ RDPI_T10 : num 1.1352 -0.1028 -0.69 2.0242 -0.0925 ...
$ DRY_T1 : num 0.6636 -0.64508 -0.24643 -1.43231 -0.00855 ...
$ DRY_T2 : num 1.008 0.823 -0.658 -0.148 0.272 ...
$ DRY_T3 : num -0.518 -0.357 1.294 0.408 0.771 ...
$ DRY_T4 : num 0.0723 0.2834 0.5198 1.6527 0.4259 ...
$ DRY_T5 : num 0.1831 1.9984 NA 0.0923 0.1232 ...
$ DRY_T6 : num -1.55 0.366 0.692 0.902 -0.993 ...
$ DRY_T7 : num -2.483 -0.334 -1.077 -1.537 0.393 ...
$ DRY_T8 : num 0.396 NA NA -0.146 -0.468 ...
$ DRY_T9 : num -0.694 0.353 2.384 0.665 0.937 ...
$ DRY_T10 : num -1.24 -1.57 -1.36 -3.88 -1.4 ...
$ FITNESS_DRY: num 1.301 3.365 0.458 0.346 1.983 ...
Цель состоит в том, чтобы запустить 10 множественных регрессий, выглядящих следующим образом:
lm1<-lm(FITNESS_DRY~DRY_T1+RDPI_T1)
lm2<-lm(FITNESS_DRY~DRY_T2+RDPI_T2)
и так далее, перебирая все десять столбцов для обоих списков.эквивалентно следующему с точки зрения индексации
lm1<-lm(FITNESS_DRY~dry[,12]+dry[,2])
lm1<-lm(FITNESS_DRY~dry[,12]+dry[,2])
и т. д.
Мой цикл должен затем вычислять итоги для каждой модели и объединять все значения (4-й столбец сводки lm) ввыходной объект.
Сначала я определил свои списки переменных
var_list<-list(
var1=dry[,12:21],
var2=dry[,2:11]
)
Это цикл, который я пробовал, который не работает должным образом:
lm.test1<-name<-vector()
for (i in 12:length(var_list$var1)){
for (j in 2:length(var_list$var2)){
lm.tmp<-lm(FITNESS_DRY~dry[,i]+dry[,j], na.action=na.omit, data=dry)
sum.tmp<-summary(lm.tmp)
lm.test1<-rbind(lm.test1,sum.tmp$coefficients[,4]) }
}
Цикл возвращает это сообщение об ошибке:
Warning message:
In rbind(lm.test6, sum.tmp$coefficients[, 4]) :
number of columns of result is not a multiple of vector length (arg 2)
Я могу вызвать объект "lm.test1", но этот объект имеет 27 строк вместо 10, которые я хочу, поэтому итерации здесь не работают должным образом.Может кто-нибудь помочь с этим, пожалуйста?Кроме того, было бы замечательно, если бы я мог добавить имена моих столбцов для каждого списка переменных в резюме.Я пытался использовать это для каждого списка переменных, но без успеха:
name<-append(name, as.character(colnames(var_list$var1))
Есть идеи?Заранее благодарен за любую помощь!
ОБНОВЛЕНИЕ1: Дополнительная информация о полном наборе данных: мои фактические данные будут по-прежнему содержать первый столбец «geneID», затем у меня будет 3772 имен столбцов DRY_T1 .... DRY_T3772, затемеще 3772 столбца с именами RDPI_T1 ... RDPI_T3772 и, наконец, моя зависимая переменная "FITNESS_DRY".Я все еще хочу запустить все аддитивные модели как таковые:
lm1<-lm(FITNESS_DRY~DRY_T1+RDPI_T1)
lm2<-lm(FITNESS_DRY~DRY_T2+RDPI_T2)
lm3772<-lm(FITNESS_DRY~DRY_T3772+RDPI_T3772)
Я имитировал набор данных как таковой:
set.seed(2)
dat3 = as.data.frame(replicate(7544, runif(20)))
names(dat3) = paste0(rep(c("DRY_T","RDPI_T"),each=3772), 1:3772)
dat3 = cbind(dat3, FITNESS_DRY=runif(20))
Затем я запускаю цикл for:
models = list()
for(i in 1:3772) {
vars = names(dat3)[grepl(paste0(i,"$"), names(dat3))]
models2[[as.character(i)]] = lm(paste("FITNESS_DRY ~ ", paste(vars, collapse="
+")),
data = dat3)
}
Это прекрасно работает при моделировании данных, но когда я пробую его на моем реальном наборе данных, который настроен точно так же, он не работает.Цикл, вероятно, имеет проблемы с обработкой чисел с двумя или более цифрами.Я получаю это сообщение об ошибке:
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
0 (non-NA) cases
ОБНОВЛЕНИЕ 2: действительно, у модели были проблемы с обработкой чисел с двумя или более цифрами.Чтобы увидеть, как что-то пошло не так в оригинальной версии, я использовал это: (мой набор данных называется «dry2»):
names(dry2)[grepl("2$", names(dry2))]
Это вернуло все переменные DRY_T и RDPI_T с числами, содержащими «2» вместо одногопара DRY_T и RDPI_T.
Чтобы решить эту проблему, этот новый код работает:
models = list()
for(i in 1:3772) {
vars = names(dry2)[names(dry2) %in% paste0(c("DRY_T", "RDPI_T"), i)]
models[[as.character(i)]] = lm(paste("FITNESS_DRY ~ ", paste(vars, collapse=" + ")),
data = dry2)
}