R: цикл по столбцу над строковыми переменными

Мой первый вопрос R, который еще не обсуждался ни на одном форуме, по-видимому... Рассмотрим мой поддельный набор данных:

A<-matrix(c(1,2,3,4,5,2,3,4,5,6,3,4,5,6,7),5,3)    
a<-c(2,4,6,8,9)

Я хочу регрессировать каждый столбец A на a и выполнить systemfit для проверки некоторых ограничений, например:

system.1<-list(A[,1]~a,A[,2]~a,A[,3]~a)    
systemfit(system.1)

Теперь моя проблема в том, что моя "настоящая" матрица А имеет сотни столбцов. Я изо всех сил пытаюсь создать список, который принимает systemfit. Я придумал следующий, не работающий код:

varlist=NULL    
for (i in 1:3){varlist[i] <- paste("A[,",i,"] ~ a",sep="")}    
  models <- lapply(varlist, function(x){    
  systemfit(substitute(j, list(j = as.name(x))))    
})    

Если вы нажмете

substitute(j, list(j = as.name(varlist)))

Вы можете видеть, что решение

`A[,1] ~ a`

содержит `` признаки, которые, кажется, вызывают проблемы для systemfit, так как это не принято как формула. Следовательно, проблема, похоже, заключается в циклическом цикле, но я не вижу альтернативы для набора данных под рукой... Есть идеи?

Любая помощь будет высоко оценен!

Спасибо!

1 ответ

Решение

Идиоматический способ сделать это состоит в том, чтобы создать список формул, которые ссылаются на столбцы в фрейме данных, а затем передать список и фрейм данных systemfit(...),

df    <- data.frame(a,A)  # data frame with columns a, X1, X2, X3, ...
forms <- lapply(paste0(colnames(df)[-1],"~a"),as.formula)
library(systemfit)
systemfit(forms,data=df)
# systemfit results 
# method: OLS 
#
# Coefficients:
# eq1_(Intercept)           eq1_a eq2_(Intercept)           eq2_a eq3_(Intercept)           eq3_a 
#       -0.182927        0.548780        0.817073        0.548780        1.817073        0.548780 
Другие вопросы по тегам