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

问题描述

我在三年内对多个站点 (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

如何从 GAM 输出获取“fitted.values”并将它们附加回原始数据框 (df)?我知道如何按如下方式手动执行此操作,但我的真实数据集有 100 个组(即siteID),我希望避免为每个站点手动执行此操作。

df[1:1095,4] <- df2[[2]][[1]][["fitted.values"]]
df[1096:2190,4] <- df2[[2]][[2]][["fitted.values"]]

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...