【问题标题】:R - Extract ns spline object from lmer model and predict on new dataR - 从 lmer 模型中提取 ns 样条对象并预测新数据
【发布时间】:2017-04-22 15:27:44
【问题描述】:

我希望从 lmer 模型预测“项”,尤其是 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 predict (unresolved issue here) 没有等效的“条款”选项。

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

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

【问题讨论】:

    标签: r regression spline predict lme4


    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2020-08-14
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多