当解释变量与效应变量间关系不明确时,通常可以使用广义相加模型来检测比变量间是否具有非线性关系。

广义相加模型通过光滑样条函数 、核函数或者局部回归光滑函数,对变量进行拟合。GAM采用模型中的每个预测变量并将其分成多个部分(由'结'​​分隔),然后将多项式函数分别拟合到每个部分。GAM的原理是最小化残差(拟合优度)同时最大化简约性(最低可能自由度)。回归模型中部分或全部的自变量采用平滑函数,降低线性设定带来的模型风险,对模型的假定不严,如不需要假定自变量线性相关于因变量(线性或非线性都可以),并且解决logistic回归当解释变量个数较多时容易引起维度灾难(Curse of dimensionality)。

R中的实现主要有两个包:gam和mgcv,前者为旧版本的包,后者为新版本。两个包的基本建模过程是相似的(两个函数都是gam ;要小心同时加载两个库),但幕后计算方法不同,优化和模型的参数也不同。当在同一数据集上使用相同的模型结构时,预计结果会略有不同。

具体解释可参见:https://blog.csdn.net/textboy/article/details/47277131

这里以mgcv包为例

1.构建基础模型

gam(y~s(x,k = , bs =)) / gam(y~te(x,k = , bs =))

k: sets up the dimensionality of the smoothing matrix for each term. Penalized regression smoothers. Using a substantially increased k to see if there is pattern in the residuals that could potentially be explained by increasing k. Default任意数字(normally 10 degree of freedom)。

bs: See smooth terms for the full list. tp – DEFAULT, thin plate regression spline,cr – penalized cubic regression spline三次样条, cs – shrinkage version of cr,cc – cyclic cubic regression spline, ps – P-spline,cp – cyclic p-spline, ad – adaptive smoothing, fs – factor smooth interaction.

s: smooth s(covariate, edf); te: tensor product smooth

install.packages('mgcv')
library(mgcv)
mode<-gam(y~s(x,df),family="",data)

2. 在基础模型构建后,最重要的是确定模型自由度。确定自由度有几种方式:

1)基于生物学知识和专家经验;2)赤池信息准则(AIC),根据AIC最小确定自由度;3)根据残差独立原则,最小化残差自相关确定自由度;4)广义交叉验证

以最小化残差自相关为例,可构建循环,设定自由度为i(从1到20),分别构建20个相应自由度的模型并计算出每个模型残差偏自相关绝对值的和stat,通过作图的方式将i与stat之间的关系显示出来。以下为示例代码:

stat<-NULL
mod<-list()
for (i in 1:20){
mod[[i]]<-gam(y~s(time,df=2*i)+as.factor(dow),family=possion,data=mydata)
tt<-sum(abs((pacf(mod[[i]]$residuals))$acf))
stat<-append(stat,tt)
}

上述代码中,列表对象mod中包含20个GAM模型,tt为每个模型残差偏自相关绝对值的和,stat则是由20个GAM模型的tt值构成的向量。

3.构建模型

final_mod<-gam(y~so2+s(time,df=14*2)+as.factor(dow),family=possion,data=mydata)
summary(final_mod)

4.模型比较与评价

在R中,GAM的比较与评价可以用aov(model1,model2,test="Chisq")或者AIC(model1,model2)来比较。通过比较选出最优模型后,可通过观察模型中非参数平滑函数的自由度改变对解释变量的影响大小来评判模型是否稳健,又称敏感性分析。

5.模型参数的解释

以下面例子为例:

library(mgcv)      #加载mgcv软件包,因为gam函数在这个包里
Data <- read.delim("Rice_insect.txt")     #读取txt数据,存到Data变量中
Data <- as.matrix(Data)     #转为矩阵形式
#查看Data数据:Data,查看第2列:Data[,2],第2行:Data[2,]<br>
Adult<-Data[,2]
Day<-Data[,3]
Precipitation<-Data[,4]<br>
result1 <- gam(log(Adult) ~ s(Day))     #此时,Adult为相应变量,Day为解释变量
summary(result1) 

结果为

Day的影响水平p-value=0.473,解释能力为14.3%,说明影响不明显。

其中,edf为自由度,理论上,当自由度接近1时,表示是线性关系;当自由度比1大,则表示为曲线关系。

result2 <- gam(log(Adult) ~ s(Precipitation))
summary(result2)

此时p-value为0.0774,说明该因子在P<0.1水平下影响显著。

参考文献:[1]张云权, 朱耀辉, 李存禄,等. 广义相加模型在R软件中的实现[J]. 中国卫生统计, 2015, 32(006):1073-1075.

[2]广义相加模型及其R实现 - 知乎 (zhihu.com)

广义相加模型(GAM)及R实现相关推荐

  1. R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...

    原文链接:http://tecdat.cn/?p=21379 本文我们对逻辑回归和样条曲线进行介绍. logistic回归基于以下假设:给定协变量x,Y具有伯努利分布, 目的是估计参数β. 回想一下, ...

  2. R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析

    总览 在这里,我们放宽了流行的线性方法的假设.最近我们被客户要求撰写关于非线性模型的研究报告,包括一些图形和统计输出.有时线性假设只是一个很差的近似值.有许多方法可以解决此问题,其中一些方法可以通过使 ...

  3. R语言淮河流域水库水质数据相关性分析、地理可视化、广义相加模型GAM调查报告...

    采样地点:淮河流域一带,昭平台水库.白龟山水库.燕山水库.石漫滩水库.板桥水库.宿鸭湖水库.博山水库.南湾水库.石山口水库.五岳水库.泼河水库.鲶鱼山水库(点击文末"阅读原文"获取 ...

  4. R语言淮河流域水库水质数据相关性分析、地理可视化、广义相加模型GAM调查报告

    最近我们被客户要求撰写关于水质数据的研究报告,包括一些图形和统计输出. 调查时间和地点 采样地点:淮河流域一带,昭平台水库.白龟山水库.燕山水库.石漫滩水库.板桥水库.宿鸭湖水库.博山水库.南湾水库. ...

  5. R语言用GAM广义相加模型研究公交专用道对行程时间变异度数据的影响

    全文链接:http://tecdat.cn/?p=30508 现实情况是,我们经常要处理多个自变量和一个因变量之间的关系,此外,虽然通过做散点图可以发现非线性关系,但很难归因其形式,多项式回归在广义线 ...

  6. R语言构建广义相加模型(GAM:Generalized Additive Model)实战

    R语言构建广义相加模型(GAM:Generalized Additive Model)实战 目录 R语言构建广义相加模型(GAM:Generalized Additive Model)实战

  7. R语言中的广义线性模型(GLM)和广义相加模型(GAM):多元(平滑)回归分析保险资金投资组合信用风险敞口

    最近我们被客户要求撰写关于信用风险敞口的研究报告,包括一些图形和统计输出. 在之前的课堂上,我们已经看到了如何可视化多元回归模型(带有两个连续的解释变量).在此,目标是使用一些协变量(例如,驾驶员的年 ...

  8. 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析

    广义相加模型(GAM:Generalized Additive Model),它模型公式如下:有p个自变量,其中X1与y是线性关系,其他变量与y是非线性关系,我们可以对每个变量与y拟合不同关系,对X2 ...

  9. R语言GAM(广义相加模型)对物业耗电量进行预测

    人们对于电力的需求与依赖随着生活水平的提高而不断加深,用电负荷预测工作开始变得越来越重要,如果可以发现用电负荷的规律性,我们就可以合理安排用电负荷.我们使用某商业物业两个星期的电耗数据进行分析. 最近 ...

最新文章

  1. 第三十四课.模糊神经网络
  2. Consider static factory methods instead of constructor
  3. JS实现sleep()方法
  4. (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  5. 自写sonar 插件加载到sonar 服务中的展示信息
  6. cout输出16进制_c++随堂测16优化方案
  7. 公益图书馆-学习笔记五-jquery来动态设置div高度
  8. Linux虚拟化KVM-Qemu分析(一)
  9. netty应用场景_彻底搞懂 netty 线程模型
  10. c语言网吧添加卡,c语言网吧计费系统源代码.docx
  11. 【转】见与不见————仓央嘉措
  12. 局部变量AND全局变量
  13. 【转】java对音频文件的频谱分析
  14. java 关键字 val,java关键字final用法知识点
  15. 计算机辅助翻译技术工具,浅析计算机辅助翻译技术对译者的影响
  16. WZOI.CC基础题库答案向导
  17. 多源信息融合_BIM+GIS的深度融合之路
  18. js控制页面只刷新一次
  19. c++ encode 函数_encode 在C++中的用法
  20. 计算机不认2t移动硬盘,高手指导win7系统无法识别2T希捷的硬盘的还原技巧

热门文章

  1. 0726 C. Cryptographer's Conundrum
  2. 201671030107胡文艳《英文文本统计分析》结对项目报告
  3. CTU Open Contest 2017 Pond Cascade
  4. 新服务挂载1T硬盘进行逻辑卷的分区
  5. 使用uview中的u-upload上传图片
  6. 如何使用python编程抢京东优惠券 知乎_618!python京东 PC 版抢券程序
  7. 微软kestrel服务器开启,asp.net-core - 如何在ASP.NET Kestrel服务器中设置TCP待办事项 - SO中文参考 - www.soinside.com...
  8. 爬瓜子二手车(json接口)
  9. 米哈游人工桌面YOYO鹿鸣
  10. 《从你的全世界路过》读后感