2010-04-17 4 views
3

Supposons que j'ai des sources de données X et Y qui sont indexables, disons des matrices. Et je veux exécuter un ensemble de régressions indépendantes et stocker le résultat. Ma première approche seraitQuelle est la meilleure façon d'exécuter une boucle de régressions dans R?

results = matrix(nrow=nrow(X), ncol=(2)) 
for(i in 1:ncol(X)) { 
     matrix[i,] = coefficients(lm(Y[i,] ~ X[i,]) 

} 

Mais, les boucles sont mauvaises, pour que je puisse le faire avec lapply comme

out <- lapply(1:nrow(X), function(i) { coefficients(lm(Y[i,] ~ X[i,])) }) 

est-il une meilleure façon de le faire?

+1

Le terme technique est «optimisation prématurée» ;-) – mjv

Répondre

0

Si vous voulez simplement effectuer une régression linéaire multiple simple, alors je recommanderais pas en utilisant lm(). Il y a lsfit(), mais je ne suis pas sûr que cela offrirait beaucoup plus d'accélération (je n'ai jamais fait de comparaison formelle). Au lieu de cela je recommanderais d'effectuer le X'y (X'X)^{- 1} en utilisant qr() et qrcoef(). Cela vous permettra d'effectuer une régression linéaire multiple multivariée; c'est-à-dire, traiter la variable de réponse comme une matrice au lieu d'un vecteur et appliquer la même régression à chaque rangée d'observations.

Z # design matrix 
Y # matrix of observations (each row is a vector of observations) 
## Estimation via multivariate multiple linear regression      
beta <- qr.coef(qr(Z), Y) 
## Fitted values                
Yhat <- Z %*% beta 
## Residuals                 
u <- Y - Yhat 

Dans votre exemple, existe-t-il une matrice de conception différente par vecteur d'observations? Si c'est le cas, vous pouvez peut-être modifier Z afin de toujours l'adapter.

6

Vous êtes certainement trop optimiste ici. Le surdébit d'une boucle est négligeable par rapport à la procédure d'ajustement de modèle et, par conséquent, la réponse simple est - utilisez ce que vous trouvez pour être le plus compréhensible possible. J'irais pour le for-loop, mais lapply est bien aussi.

1

Je fais ce genre de chose avec plyr, mais je suis d'accord que ce n'est pas un problème d'efficacité de traitement autant que ce que vous êtes à l'aise de lire et d'écrire.

Questions connexes