代码之家  ›  专栏  ›  技术社区  ›  tassones

如何将拟合的GAM模型值追加回每个组?

  •  0
  • tassones  · 技术社区  · 5 年前

    我每天观察一些数据( Var1 )三年多在几个地方( siteID )并以一年中的某一天为基础,为每个地点拟合了一个广义可加模型(GAM)( DoY ). 如何将拟合的gam值追加回原始数据帧?

    以下是一些示例数据:

    library(mgcv)
    library(dplyr)
    
    df <- data.frame(matrix(ncol = 4, nrow = 2190))
    x <- c("siteID", "DoY", "Var1", "gam_fitted_var1")
    colnames(df) <- x
    df[1:1095,1] <- rep("A",1095)
    df[1096:2190,1] <- rep("B",1095)
    df$DoY <- rep(seq(from = 1, to = 365, by = 1),6)
    set.seed(123)
    a <- 10  # amplitude
    b = 2*pi/365
    c = 1
    d = rnorm(365,2,2)
    aa = 4
    dd = rnorm(365,4,1)
    e <- rep(seq(1,365,1),3)
    y1 <- a*sin(b*(e-c))+d
    y2 <- aa*sin(b*(e-c))+dd
    df[1:1095,3] <- y1
    df[1096:2190,3] <- y2
    

    我将每组的GAM拟合如下:

    df2 <- df %>%
      group_by(siteID) %>%
      do(gam_mod = gam(Var1 ~ s(DoY, bs = 'cc'), data = .)) %>%
      ungroup
    

    df )? 我知道如何如下手动执行,但我的真实数据集有100个组(即。, )我希望避免对每个站点手动执行此操作。

    df[1:1095,4] <- df2[[2]][[1]][["fitted.values"]]
    df[1096:2190,4] <- df2[[2]][[2]][["fitted.values"]]
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Ronak Shah    5 年前

    使用 sapply 提取 "fitted.values" gam_mod 并添加为新列。

    df$gam_fitted_var1 <- c(sapply(df2$gam_mod, `[[`, "fitted.values"))
    
    推荐文章