R语言广义相加模型 (GAMs)分析预测CO2时间序列数据

简介: R语言广义相加模型 (GAMs)分析预测CO2时间序列数据

环境科学中的许多数据不适合简单的线性模型,最好用广义相加模型(GAM)来描述。

这基本上就是具有 光滑函数的广义线性模型(GLM)的扩展 。当然,当您使用光滑项拟合模型时,可能会发生许多复杂的事情,但是您只需要了解基本原理即可。

理论

让我们从高斯线性模型的方程开始 :

GAM中发生的变化是存在光滑项:

这仅意味着对线性预测变量的贡献现在是函数f。从概念上讲,这与使用二次项( )或三次项( )作为预测变量没什么不同。

在这里,我们将重点放在样条曲线上。在过去,它可能类似于分段线性函数。

例如,您可以在模型中包含线性项和光滑项的组合

或者我们可以拟合广义分布和随机效应

一个简单的例子

让我们尝试一个简单的例子。首先,让我们创建一个数据框,并创建一些具有明显非线性趋势的模拟数据,并比较一些模型对该数据的拟合程度。

x <- seq(0, pi * 2, 0.1)
sin_x <- sin(x)
y <- sin_x + rnorm(n = length(x), mean = 0, sd = sd(sin_x / 2))
Sample <- data.frame(y,x)


library(ggplot2)
ggplot(Sample, aes(x, y)) + geom_point()


尝试拟合普通的线性模型:

lm_y <- lm(y ~ x, data = Sample)


并使用geom_smooth in 绘制带有数据的拟合线 ggplot

ggplot(Sample, aes(x, y)) + geom_point() + geom_smooth(method = lm)


查看图或 summary(lm_y),您可能会认为模型拟合得很好,但请查看残差图

plot(lm_y, which = 1)


显然,残差未均匀分布在x的值上,因此我们需要考虑一个更好的模型。

运行分析

在R中运行GAM。

要运行GAM,我们使用:

gam_y <- gam(y ~ s(x), method = "REML")


要提取拟合值,我们可以predict  :

predict(gam_y, data.frame(x = x_new))


但是对于简单的模型,我们还可以利用中的 method = 参数来 geom_smooth指定模型公式。

您可以看到该模型更适合数据,检查诊断信息。

check.gam 快速简便地查看残差图。

gam.check(gam_y)


## 
## Method: REML   Optimizer: outer newton
## full convergence after 6 iterations.
## Gradient range [-2.37327e-09,1.17425e-09]
## (score 44.14634 & scale 0.174973).
## Hessian positive definite, eigenvalue range [1.75327,30.69703].
## Model rank =  10 / 10 
## 
## Basis dimension (k) checking results. Low p-value (k-index<1) may
## indicate that k is too low, especially if edf is close to k'.
## 
##        k'  edf k-index p-value
## s(x) 9.00 5.76    1.19     0.9


对模型对象使用summary将为您提供光滑项(以及任何参数项)的意义,以及解释的方差。在这个例子中,非常合适。“edf”是估计的自由度——本质上,数量越大,拟合模型就越摇摆。大约为1的值趋向于接近线性项。

## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## y ~ s(x)
## 
## Parametric coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.01608    0.05270  -0.305    0.761
## 
## Approximate significance of smooth terms:
##       edf Ref.df     F p-value    
## s(x) 5.76  6.915 23.38  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.722   Deviance explained = 74.8%
## -REML = 44.146  Scale est. = 0.17497   n = 63


光滑函数项

如上所述,我们将重点介绍样条曲线,因为样条曲线是最常实现的光滑函数(非常快速且稳定)。那么,当我们指定s(x)时实际发生了什么 ?

好吧,这就是我们说要把y拟合为x个函数集的线性函数的地方。默认输入为薄板回归样条-您可能会看到的常见样条是三次回归样条。三次回归样条曲线具有 我们在谈论样条曲线时想到的传统 _结点_–在这种情况下,它们均匀分布在协变量范围内。

基函数

我们将从拟合模型开始,记住光滑项是一些函数的和,

首先,我们提取_基本函数_集  (即滑项的bj(xj)部分)。然后我们可以画出第一和第二基函数。

model_matrix <- predict(gam_y, type = "lpmatrix")
plot(y ~ x)


现在,让我们绘制所有基函数的图,然后再将其添加到GAM(y_pred)的预测中。

matplot(x, model_matrix[,-1], type = "l", lty = 2, add = T)
lines(y_pred ~ x_new, col = "red", lwd = 2)


现在,最容易想到这样-每条虚线都代表一个函数(bj),据此 gam 估算系数(βj),将它们相加即可得出对应的f(x)的贡献(即先前的等式)。对于此示例而言,它很好且简单,因为我们仅根据滑项对y进行建模,因此它是相当相关的。顺便说一句,您也可以只使用 plot.gam 绘制滑项。

好的,现在让我们更详细地了解基函数的构造方式。您会看到函数的构造与因变量数据是分开的。为了证明这一点,我们将使用 smoothCon

x_sin_smooth <- smoothCon(s(x), data = data.frame(x), absorb.cons = TRUE)


现在证明您可以从基本函数和估计系数到拟合的滑项。再次注意,这里简化了,因为模型只是一个滑项。如果您有更多的项,我们需要将线性预测模型中的所有项相加。

betas <- gam_y$coefficients
linear_pred <- model_matrix %*% betas


请看下面的图,记住这 X 是基函数的矩阵。

通过 gam.modelssmooth.terms 滑模型类型的所有选项,基本函数的构造方式(惩罚等),我们可以指定的模型类型(随机效应,线性函数,交互作用)。

真实例子

我们查看一些CO2数据,为数据拟合几个GAM,以尝试区分年度内和年度间趋势。

首先加载数据 。

CO2 <- read.csv("co2.csv")


我们想首先查看年趋势,因此让我们将日期转换为连续的时间变量(采用子集进行可视化)。

CO2$time <- as.integer(as.Date(CO2$Date, format = "%d/%m/%Y"))


我们来绘制它,并考虑一个平稳的时间项。

我们为这些数据拟合GAM

它拟合具有单个光滑时间项的模型。我们可以查看以下预测值:

plot(CO2_time)


请注意光滑项如何减少到“普通”线性项的(edf为1)-这是惩罚回归样条曲线的优点。但如果我们检查一下模型,就会发现有些东西是混乱的。

par(mfrow = c(2,2))
gam.check(CO2_time)


残差图的上升和下降模式看起来很奇怪-显然存在某种依赖关系结构(我们可能会猜测,这与年内波动有关)。让我们再试一次,并引入一种称为周期光滑项。

周期性光滑项fintrannual(month)由基函数组成,与我们已经看到的相同,只是样条曲线的端点被约束为相等,这在建模时是有意义的周期性(跨月/跨年)的变量。

现在,我们将看到 bs = 用于选择光滑器类型的k = 参数和用于选择结数的 参数,因为三次回归样条曲线具有固定的结数。我们使用12结,因为有12个月。

s(month, bs = 'cc', k = 12) + s(time)


让我们看一下拟合的光滑项:

从这两个光滑项来看,我们可以看到,月度光滑项检测到CO2浓度的月度上升和下降——从相对幅度(即月度波动与长期趋势)来看,我们可以看出消除时间序列成分是多么重要。让我们看看现在的模型诊断是怎样的:

par(mfrow = c(2,2))
gam.check(CO2_season_time)


好多了。让我们看一下季节性因素如何与整个长期趋势相对应。

plot(CO2_season_time)


结果

从本质上讲,您可以将GAM的模型结果表示为任何其他线性模型,主要区别在于,对于光滑项,没有单一系数可供推断(即负、正、效应大小等)。因此,您需要依靠视觉上解释光滑项(例如从对plot(gam_model)的调用)或根据预测值进行推断。当然,你可以在模型中包含普通的线性项(无论是连续的还是分类的,甚至在方差分析类型的框架中),并像平常一样从中进行推断。事实上,GAM对于解释一个非线性现象通常是有用的,这个非线性现象并不直接引起人们的兴趣,但在推断其他变量时需要加以解释。

您可以通过plot 在拟合的gam模型上调用函数来绘制局部效果 ,还可以查看参数项,也可以使用 termplot 函数。您可以ggplot 像本教程前面所述那样使用 简单的模型,但是对于更复杂的模型,最好知道如何使用predict预测数据 。

geom_line(aes(y = predicted_values)



相关文章
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
2月前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
55 3
|
3月前
R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
【9月更文挑战第9天】在R语言中,利用`ggplot2`包可绘制多系列柱状图与直方图。首先读取数据文件`data.csv`,加载`ggplot2`包后,使用`ggplot`函数指定轴与填充颜色,并通过`geom_bar`或`geom_histogram`绘图。参数如`stat`, `position`, `alpha`等可根据需要调整,实现不同系列的图表展示。
|
3月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
7月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化
|
7月前
|
机器学习/深度学习 数据可视化
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为2
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
R语言在数据科学中的应用实例:探索与预测分析
【8月更文挑战第31天】通过上述实例,我们展示了R语言在数据科学中的强大应用。从数据准备、探索、预处理到建模与预测,R语言提供了完整的解决方案和丰富的工具集。当然,数据科学远不止于此,随着技术的不断发展和业务需求的不断变化,我们需要不断学习和探索新的方法和工具,以更好地应对挑战,挖掘数据的潜在价值。 未来,随着大数据和人工智能技术的普及,R语言在数据科学领域的应用将更加广泛和深入。我们期待看到更多创新的应用实例,为各行各业的发展注入新的动力。
|
4月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
4月前
|
资源调度 数据挖掘
R语言回归分析:线性回归模型的构建与评估
【8月更文挑战第31天】线性回归模型是统计分析中一种重要且实用的工具,能够帮助我们理解和预测自变量与因变量之间的线性关系。在R语言中,我们可以轻松地构建和评估线性回归模型,从而对数据背后的关系进行深入的探索和分析。
|
4月前
|
机器学习/深度学习 数据采集
R语言逻辑回归、GAM、LDA、KNN、PCA主成分分类分析预测房价及交叉验证
上述介绍仅为简要概述,每个模型在实施时都需要仔细调整与优化。为了实现高度精确的预测,模型选择与调参是至关重要的步骤,并且交叉验证是提升模型稳健性的有效途径。在真实世界的房价预测问题中,可能还需要结合地域经济、市场趋势等宏观因素进行综合分析。
89 3
下一篇
DataWorks