中娱网

非线性模型之广义相加模型(GAM)-原理与应用概述

2023-08-26 13:17:31 来源:哔哩哔哩

Essentially, all models are wrong, but some are useful --George Box

本质上,所有模型都是错的,但有些是有用的。--乔治·波克斯


【资料图】

这句话出自英国著名的统计学家和教授George Box,他是二十世纪下半叶的统计学大师之一,在实验设计、时间序列分析、统计控制和贝叶斯推断等方面做出了重要贡献。

他曾说过所有模型都是错的,但有些是有用的。

有三点原因:

真实世界的复杂性:现实世界是复杂多变的,无法用一个简单的模型来捕捉所有的细节和变化。模型通常是对现实的一种抽象和简化,可能无法完美地反映所有情况。

数据的不确定性:模型的构建基于对数据的观察和收集,而数据本身往往包含噪声和不确定性。这些不确定性会传播到模型中,导致模型的预测或估计也带有不确定性。

假设的限制:模型建立时通常会基于某些假设,这些假设可能不完全符合真实情况。例如,线性回归模型假设变量之间的关系是线性的,但实际情况可能更复杂。这些假设的限制可能导致模型在某些情况下产生偏差或错误的预测。

每当我们建立统计模型时,我们都会在flexibility(灵活性) 和  interpretabilit(可解释性)之间进行权衡,在回归分析中,线性模型易于解释和使用,很容易理解其参数的含义,但是,我们通常需要对比线性关系所代表的更为复杂的线性进行建模。另一方面机器学习模型,例如随机森林,神经网络,可以很好的预测复杂的关系。问题是往往机器学习需要大数据,其结果难以解释,而且很少能对模型结果中进行统计推断。而GAM等非线性模型(Generalized Additive Model)为简单的线性回归折中的方案。

GAM可以适应复杂的非线性关系并在这些情况下可以做出很好的预测,但我们仍然能够进行统计推断和理解并解释我们的模型基本结构,以及为什么要做出预测。GAM让我们可以灵活地对非线性关系进行建模。

Generalized

广义是指预测变量与因变量之间的关系可以是非线性的,并且可以通过非参数光滑函数来建模。光滑函数可以是任何形状的曲线,不限于线性、二次或者其他特定形式的函数。以下为广义加性模型常见的link函数。

目前大多数已发表的文章在建模时通常采用定量变量为Y进行建模。而广义使得GAM同样可以探索定性变量为Y时的概率趋势变化

Additive

下图展示了GAM中的柔性平滑实际上是由许多Basis functions(基函数)的和,每个基函数乘上一个系数,每个系数都是模型中的一个参数(下图我们假定所有的基础函数相同),这些基函数组合起来就成了GAM。

在建模时,我们通常需要制定自由度参数,而这个参数就是通过平滑参数(k)或lambda(sp)值来控制模型的拟合程度,在未指定的情况下,SAS软件的GAM/GAMPL和R的mgcv包中会根据优化此平滑参数,从而确定最佳的参数。

但随着自由度的增加,曲线的形状越来越复杂,越复杂的曲线我们越难总结出趋势,而太过于简单的模型,又无法发现数据的规律,所以往往自由度的确定需要我们对数据进行探索,以下为R和SAS分别构建因变量为正态分布和二项分布时的基础代码。(SAS 仅能拟合二分类因变量,且无法建立带混合效应的GAM模型,对于多分类目前仅有R支持建模,且R还可以建立混合效应的GAM模型)。

R code:

MODEL1 <- gam(data=hb2,sleep~s(high),method="REML")

MODEL2 <- gam(list(dc015~s(high),

~s(high),

~s(high),

data=hb,family=multinom(K=3),type="response")

SAS code:

procgamdata=diabetes;

model logCP = spline(Age) spline(BaseDeficit);

run;

procgamdata=hb plots=components(clm commonaxes);

class  Marriage(ref=first) residence(ref=first) gender(ref=first);

model da007_1 (event='1') = spline(high ,df=5) param(Marriage residence gender) / dist=binomial;

run;

其结果由参数部分和非参数部分组成,以下为SAS的:

以下为R的:

在R中可在控制台和绘图中提供多个输出,首先报告了模型是否完全收敛,R找到了最佳的模型拟合参数,当我模型中参数太多而数据不足时,可能会发生这种情况(在许多未收敛模型中都存在此问题),如果模型未收敛,则结果可能不正确陷入局部最优解。

该表显示了对模型残差模式的统计量检验,残差的分布应该是随机的,每行报告了一个平滑项的检验结果(见最后一行),当我们的自由度(R=k SAS=df)远离k’+1时说明我们的基函数数量太少,这只是一个近似测试,最终结果还是需要我们进行可视化,除了查看P值(>表示通过测试)以外,还要比较k和edf值(越接近越好)。所以在报告时我们应报告不同k与edf值的比较,以告诉审稿人我们是如何确定我们的自由度的。

Explaining predictions by terms

library(broom)

predict(,type="terms")[1,]

下图输出了我们模型的每个变量对预测概率的贡献,主要是使得我们能够得到平滑项的贡献大小。

我们还可以得到转换后截距项的预测概率

#截距的预测概率

plogis(sum(predict(,type="terms")[1, ])+coef()[1])

即X为0且其他变量为平均水平下时,Y的建模概率为%。

GAM建模过程中有许多细节需要提及,例如SAS的PROC GAM、PROC GAMPL以及R的gam(),bam()到底有什么区别?估计方法中“REML”又是什么?其结果如何解读?模型的评价标准有哪些?如何抉择?;定量变量和定性变量为因变量时结果又有什么不同?为什么GAM模型图中的Y轴与我们建模时的Y的尺度不一致?后续推文我们会一一解答。

程序编写:想不出吸睛好名字

文字编辑:想不出吸睛好名字

审阅:老陈

关注微信公众号,获取更多相关内容!

标签:

热门推荐