2012-06-18 4 views
0

Je suis en cours d'exécution une simulation où je veux adapter un modèle linéaire à des sous-ensembles de mes données:de plusieurs sous-ensembles de montage d'un data.frame

library(reshape2) 
library(plyr) 

all <- mutate(iris, mean_width = ave(Petal.Width, Petal.Length)) 
str(all) 

## want to minimise sum(|y*polynomial(x) - z|^2) for each id 
## in the region where x != exclude 

weighted_difference <- function(d, n=4, exclude = c(2.5, 3), ...){ 

    sub <- subset(d, !(Sepal.Width > exclude[1] & 
        Sepal.Width < exclude[2])) 
    fit <- lm(mean_width ~ I(poly(Petal.Length, n, raw=TRUE)*Petal.Width) + Petal.Width - 1, data = sub) 
    mutate(d, predict = predict(fit, d), 
     difference = Petal.Width - predict) 
} 

results <- ddply(all, "Species", weighted_difference) 

Cela fonctionne, mais je voudrais utiliser une approche plus simple où je crée d'abord une nouvelle data.frame pour l'ajustement,

exclude <- c(3, 6) 
    sub <- subset(all, !(x > exclude[1] & x < exclude[2])) 

adaptent tous les cas,

fits <- lm(z ~ I(poly(x, n, raw=TRUE)*y) + y - 1 | id, data = sub) 

(ce ... | id est une syntaxe non valide apparemment)

et utiliser prédire les données complètes à la fois,

all <- mutate(all, predict = predict(fits, all), difference = y - predict) 

Y at-il une astuce pour utiliser lm() comme ça? Ou une meilleure solution? Merci.

+0

Qu'est-ce que vous essayez exactement en utilisant '... | id'? Si vous voulez intégrer des interceptions aléatoires, vous devez utiliser des modèles mixtes, par exemple le paquetage 'nlme' ou' lme4'. –

+0

désolé, je suppose que l'utilisation de données aléatoires n'est pas très clair, je vais mettre à jour l'exemple. Avec '... | id' Je veux dire que l'ajustement doit être fait pour chaque groupe défini par 'id', comme dans les diagrammes en treillis. – baptiste

Répondre

2

Est-ce que lmList (à partir de nlme) fait ce que vous voulez?

library(nlme) 
fits <- lmList(z ~ I(poly(x, n, raw=TRUE)*y) + y - 1 | id, data = sub) 
Questions connexes