2016-07-07 7 views
1

Ich habe eine Matrix Y der Zeitreihe. Die Anzahl der Zeilen ist die Anzahl der Beobachtungen. Ich habe auch eine Matrix von Prädiktoren X. Ich möchte Spalten von Y auf Prädiktoren zurück, die für diese Spalten spezifisch sind. Eine logische Matrix von 1 und 0 zeigt an, ob die i -te Variable auf dem j -ten Prädiktor regressiert werden soll.Multivariate Regression mit verschiedenen Prädiktoren für jede Variable in R

Zum Beispiel:

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) 

Hier y1 sollte auf x1 und x2 regrediert werden, y2 auf x1 nur und y3 auf x2 nur.

Ich habe versucht, das Modell in der lm Funktion anzugeben, aber ich war nicht in der Lage, dies zu tun. Im Ergebnis $coefficients möchte ich "0" s, wenn eine Variable nicht auf dem j -ten Prädiktor zurückgebildet wird.

Ist es möglich, ohne schwere schmutzige Schleifen zu tun?

+0

Die 'reformulate' Funktion könnte dies etwas erleichtern. – lmo

+0

Ah, schade! ... – Petreius

+0

Da ich ein Anfänger bin, bin ich immer noch nicht sehr wohl mit lapply(). Können Sie ein Beispiel mit dem obigen Spielzeugdatensatz angeben? – Petreius

Antwort

1

Leider können Sie es nicht mit einer einzigen Formel tun. Sie müssen eine for Schleife oder für diese Aufgabe verwenden. Haben Sie gehen dazu:

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 

Sie zuerst alle Formel in einer Liste sammeln, dann lapply eine Schleife durch sie verwenden. Am Ende haben Sie drei lineare Modelle in der lmlist. Verwenden Sie lmlist[[1]], um das erste zu extrahieren.

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

#Coefficients: 
#(Intercept)   x1   x2 
#  4.2972  -0.6521  0.4592 
Verwandte Themen