применение lm к нескольким наборам данных


Ниже приведены 4 набора данных (я просто создал их случайным образом для обеспечения воспроизводимого кода). Я создал список из них, чтобы я мог применить "lm" к этим нескольким наборам данных сразу:

H<-data.frame(replicate(10,sample(0:20,10,rep=TRUE)))   
C<-data.frame(replicate(5,sample(0:100,10,rep=FALSE)))
R<-data.frame(replicate(7,sample(0:30,10,rep=TRUE)))
E<-data.frame(replicate(4,sample(0:40,10,rep=FALSE)))

dsets<-list(H,C,R,E)
models<-lapply(dsets,function(x)lm(X1~.,data=x))
lapply(models,summary)

Переменные в каждом из наборов данных различны (как по количеству, так и по именам. Однако, если вы запустите код, все они будут x1,x2..и так далее). Первый столбец/переменная в каждом будет ответом, а остальные будут независимыми переменными.

Этот код работает, но не на мой фактический набор данных. Поскольку мои наборы данных имеют фактические имена переменных, я использовал позицию переменной, как показано ниже:

   dsets<-list(H,C,R,E)
   models<lapply(dsets,function(x)lm(x[,1]~.,data=x))
   lapply(models,summary)

Используя вышесказанное, результаты перепутались. Она также включает в себя переменную ответа в качестве независимой переменной.

Может ли кто-нибудь помочь?

EDIT: я понял, что x [, 1] вызывает весь столбец, а не имя столбца

   models<lapply(dsets,function(x)lm(colnames(x)[1]~.,data=x))
   lapply(models,summary)
Но и это не работает. Я получаю следующую ошибку
Error in model.frame.default(formula = colnames(H[1]) ~ ., data = H, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'Var1')
1 5

1 ответ:

models <- lapply(dsets, 
             function(data){
               lm(reformulate(termlabels=".", response=names(data)[1]), data)
             })

reformulate позволяет построить формулу из строк character.