2016-07-07 2 views
1

У меня есть матрица Y временных рядов. Количество строк - это количество наблюдений. У меня также есть матрица предикторов X. Я хочу регрессировать столбцы Y о предикторах, специфичных для этих столбцов. Логическая матрица 1 и 0 показывает, следует ли регрессировать переменную i на j-м предиктором.Многомерная регрессия с разными предикторами для каждой переменной в R

Например:

y1 <- c(1, 2, 3, 5, 7, 3, 2, 1) 
y2 <- c(5, 1, 3, 1, 3, 4, 5, 3) 
y3 <- c(1, 3, 4, 5, 1, 2, 1, 2) 
x1 <- c(2, 5, 4, 2, 1, 3, 6, 7) 
x2 <- c(1, 5, 1, 3, 4, 2, 1, 3) 

Y <- cbind(y1, y2, y3) 
X <- cbind(x1, x2) 

logical <- matrix(c(1,1,0,1,0,1), 3, 2) 
lm <- lm(Y ~ ??? - 1) 

Здесь y1 должны быть регресс на x1 и x2, y2 на x1 только и y3 на только x2.

Я попытался указать модель в функции lm, но я не смог это сделать. В результате $coefficients я хотел бы «0», когда переменная не была регрессирована на j-м предиктором.

Можно ли сделать это без тяжелых грязных петель?

+0

Функция «переформулировать» может сделать это немного проще. – lmo

+0

Ах, слишком плохо! ... – Petreius

+0

Поскольку я новичок, мне все еще не очень легко с lapply(). Не могли бы вы привести пример с набором данных игрушек выше? – Petreius

ответ

1

К сожалению, вы не можете сделать это с помощью единой формулы. Вы должны использовать цикл for, или lapply(), чтобы выполнить эту работу. Имейте идти на это:

y1 <- c(1, 2, 3, 5, 7, 3, 2, 1) 
y2 <- c(5, 1, 3, 1, 3, 4, 5, 3) 
y3 <- c(1, 3, 4, 5, 1, 2, 1, 2) 
x1 <- c(2, 5, 4, 2, 1, 3, 6, 7) 
x2 <- c(1, 5, 1, 3, 4, 2, 1, 3) 

flst <- c(y1 ~ x1 + x2, y2 ~ x1, y3 ~ x2) ## formula list 
lmlist <- lapply(flst, lm) ## linear model list 

Сначала собрать всю формулу в списке, а затем использовать lapply перебрать их. В конце концов, у вас будет три линейные модели в lmlist. Используйте lmlist[[1]], чтобы извлечь первый.

lmlist[[1]] 
#Call: 
#FUN(formula = X[[i]]) 

#Coefficients: 
#(Intercept)   x1   x2 
#  4.2972  -0.6521  0.4592 
Смежные вопросы