R-从lmer模型中提取ns样条对象并预测新数据 [英] R - Extract ns spline object from lmer model and predict on new data

查看:58
本文介绍了R-从lmer模型中提取ns样条对象并预测新数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望根据lmer模型预测项",尤其是ns样条.我已经用mtcars数据集复制了这个问题(在技术上很差的示例,但是可以使问题更清楚).

这是我要使用线性模型进行的操作:

 数据(mtcars)mtcarsmodel<-lm(wt〜ns(drat,2)+ hp + as.factor(gear),data = mtcars)摘要(mtcarsmodel)系数(mtcarsmodel)测试<-预测(mtcarsmodel,类型=条款") 

完美.但是,没有用于lmer预测的等效术语"选项(

I'm looking to predict 'terms', especially ns splines, from an lmer model. I've replicated the problem with the mtcars dataset (technically poor example, but works to get the point across).

Here is what I'm trying to do with a linear model:

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

Perfect. However, there is no equivalent 'terms' option for lmer predict (unresolved issue here).

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

Given there is no equivalent ‘predict, terms’ function, I was going to extract the fixed and random coefficients above and apply the coefficients to the mtcars data, but have no idea on how to extract an ns spline object from a model and 'predict' it to some new data. The same goes for a 'poly' transformed variable eg. poly(drat, 2) - extra kudos if you can get this as well.

解决方案

It is not difficult to do it yourself.

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"

If we want to predict the ns term, just do

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

这篇关于R-从lmer模型中提取ns样条对象并预测新数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆