如何将拟合的 GAM 模型值附加回每个组?
How can I append fitted GAM model values back to each group?
三年来,我在多个站点 (siteID
) 每天观察一些数据 (Var1
),并根据年 (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
从每个 gam_mod
中提取 "fitted.values"
并添加为新列。
df$gam_fitted_var1 <- c(sapply(df2$gam_mod, `[[`, "fitted.values"))
三年来,我在多个站点 (siteID
) 每天观察一些数据 (Var1
),并根据年 (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
从每个 gam_mod
中提取 "fitted.values"
并添加为新列。
df$gam_fitted_var1 <- c(sapply(df2$gam_mod, `[[`, "fitted.values"))