2016-12-07 11 views
0

Я ищу предсказать «термины», особенно ns сплайны, из модели lmer. Я реплицировал проблему с помощью набора данных mtcars (технически плохой пример, но работает, чтобы получить смысл).R - Извлечь ns spline-объект из модели lmer и предсказать по новым данным

Вот что я пытаюсь сделать с линейной моделью:

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

Perfect. Тем не менее, для прогноза lmer нет эквивалентных «терминов» (unresolved issue here).

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

Учитывая нет никакого эквивалента «предсказать, термины» функция, я собирался извлечь фиксированные и случайные коэффициенты выше и применять коэффициенты к данным mtcars, но не имеют ни малейшего представления о том, как извлечь нс сплайн объект от модели и «предсказывать» его к некоторым новым данным. То же самое относится к преобразованной переменной «poly», например. poly (drat, 2) - лишний раз, если вы тоже можете это получить.

ответ

1

Это не сложно сделать это самостоятельно.

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" 

Если мы хотим предсказать ns термин, просто сделать

## 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

 Смежные вопросы

  • Нет связанных вопросов^_^