R - 从 lmer 模型中提取 ns 样条对象并预测新数据

R - Extract ns spline object from lmer model and predict on new data

我希望根据 lmer 模型预测 'terms',尤其是 ns 样条。我已经用 mtcars 数据集复制了这个问题(技术上很差的例子,但可以理解这一点)。

这是我尝试使用线性模型执行的操作:

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

完美。但是,lmer 预测 (unresolved issue here) 没有等效的 'terms' 选项。

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

鉴于没有等效的“预测、项”函数,我打算提取上面的固定和随机系数并将系数应用于 mtcars 数据,但不知道如何从中提取 ns 样条对象一个模型和 'predict' 它到一些新数据。 'poly' 转换后的变量也是如此,例如。 poly(drat, 2) - 如果你也能得到这个,额外的荣誉。

自己做也不难

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")