2016-12-07 6 views
0

Je cherche à prédire des 'termes', en particulier des splines ns, à partir d'un modèle lmer. J'ai répliqué le problème avec le jeu de données mtcars (exemple techniquement médiocre, mais fonctionne pour faire passer le point).R - Extraire l'objet spline ns du modèle lmer et prédire les nouvelles données

Voici ce que je suis en train de faire avec un modèle linéaire:

data(mtcars) 
mtcarsmodel <- lm(wt ~ ns(drat,2) + hp + as.factor(gear), data= mtcars) 
summary(mtcarsmodel) 
coef(mtcarsmodel) 
test <- predict(mtcarsmodel, type = "terms") 

Parfait. Cependant, il n'y a pas d'option 'terms' équivalente pour lmer predict (unresolved issue here).

mtcarsmodellmer <- lmer(wt ~ ns(drat,2) + (hp|as.factor(gear)), data= mtcars) 
summary(mtcarsmodellmer) 
coef(mtcarsmodellmer) 
ranef(mtcarsmodellmer) 

Étant donné qu'il n'y a pas équivalent »prédire, les termes de la fonction, j'allais extraire les coefficients fixes et aléatoires ci-dessus et appliquer les coefficients aux données mtcars, mais ont aucune idée sur la façon d'extraire une spline ns objet d'un modèle et «le prédire» à de nouvelles données. La même chose vaut pour une variable transformée «poly», par exemple. poly (drat, 2) - félicitations supplémentaires si vous pouvez obtenir cela aussi bien.

Répondre

1

Il n'est pas difficile de le faire vous-même.

library(lme4) 
library(splines) 
X <- with(mtcars, ns(drat, 2)) ## design matrix for splines (without intercept) 
## head(X) 
#    1   2 
#[1,] 0.5778474 -0.1560021 
#[2,] 0.5778474 -0.1560021 
#[3,] 0.5738625 -0.1792162 
#[4,] 0.2334329 -0.1440232 
#[5,] 0.2808520 -0.1704002 
#[6,] 0.0000000 0.0000000 

## str(X) 
# ns [1:32, 1:2] 0.578 0.578 0.574 0.233 0.281 ... 
# - attr(*, "dimnames")=List of 2 
# ..$ : NULL 
# ..$ : chr [1:2] "1" "2" 
# - attr(*, "degree")= int 3 
# - attr(*, "knots")= Named num 3.7 
# ..- attr(*, "names")= chr "50%" 
# - attr(*, "Boundary.knots")= num [1:2] 2.76 4.93 
# - attr(*, "intercept")= logi FALSE 
# - attr(*, "class")= chr [1:3] "ns" "basis" "matrix" 

fit <- lmer(wt ~ X + (hp|gear), data= mtcars) 

beta <- coef(fit) 
#$gear 
#   hp (Intercept)  X1   X2 
#3 0.010614406 2.455403 -2.167337 -0.9246454 
#4 0.014601363 2.455403 -2.167337 -0.9246454 
#5 0.006342761 2.455403 -2.167337 -0.9246454 
# 
#attr(,"class") 
#[1] "coef.mer" 

Si nous voulons prédire le terme ns, il suffit de faire

## use `predict.ns`; read `?predict.ns` 
x0 <- seq(1, 5, by = 0.2) ## example `newx` 
Xp <- predict(X, newx = x0) ## prediction matrix 
b <- with(beta$gear, c(X1[1], X2[1])) ## coefficients for spline 
y <- Xp %*% b ## predicted mean 

plot(x0, y, type = "l") 

enter image description here