gpt4 book ai didi

r - 如何从 GAM (`mgcv::gam` 中提取拟合样条)

转载 作者:行者123 更新时间:2023-12-03 23:09:50 26 4
gpt4 key购买 nike

我正在使用 GAM 对逻辑回归中的时间趋势进行建模。然而,我想从中提取拟合样条线以将其添加到另一个无法在 GAM 或 GAMM 中拟合的模型中。

因此我有两个问题:

  • 我怎样才能随着时间的推移拟合更平滑的东西,以便我强制一个结位于特定位置,同时让模型找到其他结?
  • 如何从拟合的 GAM 中提取矩阵,以便我可以将其用作不同模型的插补?

  • 我运行的模型类型如下:
    gam <- gam(mortality.under.2~ maternal_age_c+ I(maternal_age_c^2)+
    s(birth_year,by=wealth2) + wealth2 + sex +
    residence + maternal_educ + birth_order,
    data=colombia2, family="binomial")

    我已经阅读了 GAM 的大量文档,但我仍然不确定。
    任何建议都非常感谢。

    最佳答案

    mgcv::gam有一种方法可以做到这一点(您的 Q2),通过 predict.gam方法和 type = "lpmatrix" .
    ?predict.gam甚至有一个例子,我在下面复制:

     library(mgcv)
    n <- 200
    sig <- 2
    dat <- gamSim(1,n=n,scale=sig)

    b <- gam(y ~ s(x0) + s(I(x1^2)) + s(x2) + offset(x3), data = dat)

    newd <- data.frame(x0=(0:30)/30, x1=(0:30)/30, x2=(0:30)/30, x3=(0:30)/30)

    Xp <- predict(b, newd, type="lpmatrix")

    ##################################################################
    ## The following shows how to use use an "lpmatrix" as a lookup
    ## table for approximate prediction. The idea is to create
    ## approximate prediction matrix rows by appropriate linear
    ## interpolation of an existing prediction matrix. The additivity
    ## of a GAM makes this possible.
    ## There is no reason to ever do this in R, but the following
    ## code provides a useful template for predicting from a fitted
    ## gam *outside* R: all that is needed is the coefficient vector
    ## and the prediction matrix. Use larger `Xp'/ smaller `dx' and/or
    ## higher order interpolation for higher accuracy.
    ###################################################################

    xn <- c(.341,.122,.476,.981) ## want prediction at these values
    x0 <- 1 ## intercept column
    dx <- 1/30 ## covariate spacing in `newd'
    for (j in 0:2) { ## loop through smooth terms
    cols <- 1+j*9 +1:9 ## relevant cols of Xp
    i <- floor(xn[j+1]*30) ## find relevant rows of Xp
    w1 <- (xn[j+1]-i*dx)/dx ## interpolation weights
    ## find approx. predict matrix row portion, by interpolation
    x0 <- c(x0,Xp[i+2,cols]*w1 + Xp[i+1,cols]*(1-w1))
    }
    dim(x0)<-c(1,28)
    fv <- x0%*%coef(b) + xn[4];fv ## evaluate and add offset
    se <- sqrt(x0%*%b$Vp%*%t(x0));se ## get standard error
    ## compare to normal prediction
    predict(b,newdata=data.frame(x0=xn[1],x1=xn[2],
    x2=xn[3],x3=xn[4]),se=TRUE)

    这贯穿整个过程,甚至是在 R 或 GAM 模型之外完成的预测步骤。您将不得不稍微修改示例以执行您想要的操作,因为该示例评估模型中的所有项,并且除了样条之外还有另外两个项 - 基本上您做同样的事情,但仅针对样条项,即涉及查找 Xp 的相关列和行样条的矩阵。然后您还应该注意样条曲线是居中的,因此您可能也可能不想撤消它。

    对于您的 Q1,为 xn 选择适当的值示例中的向量/矩阵。这些对应于 n 的值模型中的第 1 项。因此,将您想要固定的那些设置为某个平均值,然后改变与样条关联的那个。

    如果您在 R 中执行所有这些操作,则更容易仅以样条协变量的值来评估样条曲线,因为您拥有将要进入另一个模型的数据。您可以通过创建一个值的数据框来进行预测,然后使用
    predict(mod, newdata = newdat, type = "terms")

    哪里 mod是拟合的 GAM 模型(通过 mgcv::gam ), newdat是包含模型中每个变量的一列的数据框(包括参数项;将您不想改变的项设置为某个恒定平均值 [例如数据集中变量的平均值] 或某个级别,如果一个因素)。 type = "terms"部分将为 newdat 中的每一行返回一个矩阵对模型中每个项的拟合值的“贡献”,包括样条项。只需取与样条对应的矩阵的列 - 它再次居中。

    也许我误解了你的 Q1。如果您想控制结,请参阅 knots论据 mgcv::gam .默认情况下, mgcv::gam在数据的极端处放置一个结,然后剩余的“结”在间隔上均匀分布。 mgcv::gam找不到结 - 它会为您放置它们,您可以通过 knots 控制将它们放置的位置争论。

    关于r - 如何从 GAM (`mgcv::gam` 中提取拟合样条),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15584541/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com