第7章,广义相加模型(GAMs)

参考:
第七章:http://www-bcf.usc.edu/~gareth/ISL/
https://en.wikipedia.org/wiki/Spline_(mathematics)
http://web.as.uky.edu/statistics/users/pbreheny/621/F10/notes/11-4.pdf
http://learning.cis.upenn.edu/cis520_fall2009/index.php?n=Lectures.LocalLearning


从第二章开始,主要介绍的重点都是线性模型。线性模型简单、直观、便于理解,但是现实中,线性假设很可能不能满足实际需求,甚至直接违背实际情况。在第6、7章会介绍一些方法来弥补线性模型的不足,通过降低模型的复杂度和估计量的方差来改善模型。但我们还可以通过另一种方式来改善模型,那就是改变”线性假设”。接下来,我们介绍一些由线性假设下,扩展得到的其他模型。

一,多项式回归

在了解简单线性模型的基础上,很容易理解多项式回归,形如:
yi=β0+β1x11+β2x22+...++βnxnn+ei
其中, ei 为误差项

多项式回归的优点是,随着变量的增加,可以拟合出异常极端变化的曲线。不过通常来说,多项式回归基本都不会超过四项式。

多项式也可以结合logistics进行回归,形如:
P(yi|xi)=exp(β0+β1x11+β2x22+...++βnxnn)1+exp(β0+β1x11+β2x22+...++βnxnn)

二,分段常值函数(step functions)

不论简单线性回归、多项式回归等都是具有全局性的结构。再不考虑全局性回归时,可以用到分段回归。

最简单的分段回归应该就是形如阶跃函数了,阶跃函数也是提供连续变量离散化成有序分类变量的方法。

过程如下:
对X进行分组;
每个组拟合出不同的常量;

假设对X有K个截点, c1,c2,...,ck
我们生成K+1个新变量:

这些变量有时候也叫虚拟变量或哑变量,然后对这K+1个变量进行拟合,得到形如:

三,基底函数(basis functions)

前两种回归方式,都可以总结为是基底函数的特例。所谓的基底函数是不直接对X进行回归,而是用函数函数变化后的 bi(xi) 值进行回归,形如:

bj(xi)=xji 时,就变成了多项式回归;
bj(xi)=I(cjxi<cj+1) 时,就变成了分段回归;

四,回归样条(Regression Splines)

由基底函数可知,基函数可以是任意的组合形式,不过接下来我们介绍的一种基函数是结合了多项式和分段常值函数的”回归样条”.

什么是样条呢?
样条是一个函数,由多项式构造的分段函数,并且在分段节点处要具有高度平滑的特性,即在分段结点处连续且有连续的导数。

1,三次样条:
一个三次多项式分段回归如下,但是该回归并不满足”平滑的特性”,在结点处可能出现跳跃。

所以,我们要加两个限制条件,让其变成一个样条回归:
1)结点处连续;
2)结点处平滑;

定义,K个节点下的三次样条回归模型:

三次样条下,基函数 b() 也有非常多的选择,最直接的方法就是对
X,X2,X3,h(X,ξ1),h(X,ξ2),...,h(X,ξK) ,进行拟合

其中, ξi 是结点:

样条缺点是,有时候受异常点影响较大。需要加上额外的边界约束。

2,如何确定结点的个数与位置

一种方法是在变化相对稳定的区间设置尽量少的结点,在变化相对快速的地方设置尽量多的结点。尽量让每个结点区间内的变量趋于均匀分布。

另一种方法是设置自由度,根据算法自动跑出最优的结点位置。

自由度的个数可以结合交叉验证来验证。

3,与多项式回归的比较

由于样条有结点的帮助,所以在变动很大的数据背景下,仍然可以保证多项式的次数较小。而多项式回归则可能需要更多的次数(如 X15 ) 。一句话概括即是样条比多项式回归更灵活。

4,平滑样条曲线

假设我们样条函数为g(x),再求得该函数参数的同时,如何保证样条曲线的平滑性呢?
结合第四章所讲,在求解样条回归的结构风险最小化(RSS+惩罚项)时,把惩罚项设置为”平滑性”相关的表示,形如:

函数在某点处的一阶导数表示的该点曲线的斜率,二阶导数表示的就是斜率的变化率,即,惩罚项即表示为函数曲线在该点的平滑性。

但是,在一段区间内,曲线整体的平滑性要如何衡量呢?我们用到了 。上式中的惩罚项表示为对区间t内,一阶导数g(t)累计的变化情况,因此可以用来衡量该段区间整体的平滑性了。

超参λ,则是用来衡量惩罚项的重要性占比的。一般用n折交叉验证或者留一交叉验证法来确定。

五,局部回归(Local Regression)

局部回归是另一种拟合非线性模型的方法。

为了实现局部回归,有许多重要步骤需要确定:
- 确定加权函数K
- 确定局部回归的模型:线性/二次/还是常数等,通常是简单模型
- 最重要的还是对“局部”的定义,如何确定点 x0 点近临范围“s”

范围s的值越小,每次拟合的数据区间越小,并且到下一个拟合点到距离也越小。我们可以用交叉验证的方法来确定s,或者人为设定一个值。

1)最简单的局部模型
局部平均(local average)模型是最简单的局部模型,形如:

其缺点是,估计结果并非是连续的。
且与KNN的思想类似,是一种非参数方法。

2)Nadaraya-Watson 核估计(NW)

引用核估计方法,将local average模型进行改造,当K是连续时,f即为连续的。

其局部性参数h可以通过交叉验证的方式计算得到。

不过当x不是均匀分布的时候,该方法将产生偏倚。

3)lowess

前两种方法都属于非参数方法,下面介绍一种结合了非参和参数模型的方法:lowess或者又叫做loess,通过对局部进行线性拟合(非常数值拟合),来解决NW的缺点。

lowess 算法:
1)给定数据集 D=(xi,yi) , 核函数K(),
2)拟合局部回归 w^(x)=argminni=1K(x,xi)(wTxiyi)2
3)得到拟合结果 w^(x)Tx

局部加权logistics回归算法:
1)给定数据集 D=(xi,yi) , 核函数K(),
2)拟合局部回归 w^(x)=argminni=1K(x,xi)log(1+exp(yiwTxi))
3)得到拟合结果 sign(w^(x)Tx)

总结:

六,广义相加模型(Generalized Additive Models)

前面,我们已经介绍了一些方法,作为简单线性模型的扩展。这些方法可以归纳为广义相加模型(GAMs)的框架里,形如:

之所是”相加性的”,是因为我们对于每个变量 Xj 都单独计算 fj fj 可以是任意形式的函数,最后统一加起来用来预测 Y .

GAMs的优缺点:
- 可以引入非线性函数fj
- 非线性可能使得对Y预测的更准确
- 因为是”相加性的”,所以,线性模型的假设检验的方法仍然可以使用
- 因为是“相加性”假设,所以GAMs中可能会缺失重要的交互作用 Xj×Xk ,只能通过手动添加交互项来弥补。

  • 31
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
建立广义相加模型GAMs的步骤如下: 1. 导入数据集 使用R语言中的read.csv()函数导入ChicagoNMMAPS数据集。 2. 安装并加载mgcv包 GAMs建模需要使用mgcv包,因此需要先安装并加载该包,可以使用以下代码实现: ``` install.packages("mgcv") library(mgcv) ``` 3. 数据预处理 对数据进行预处理,包括去除缺失值、将日期转化为R中的日期格式等。可以使用以下代码实现: ``` # 读取数据集 data <- read.csv("ChicagoNMMAPS.csv", header = TRUE) # 去除缺失值 data <- na.omit(data) # 将日期转化为R中的日期格式 data$Date <- as.Date(data$Date, "%m/%d/%Y") ``` 4. 模型建立 使用mgcv包中的gam()函数建立广义相加模型,其中温度为自变量,死亡率为因变量,其他因素设为混杂因素进行控制。可以使用以下代码实现: ``` # 模型建立 model <- gam(Death ~ s(Temp, k = 5) + s(DewPointTemp, k = 5) + s(RelativeHumidity, k = 5) + s(PM10, k = 5) + s(Ozone, k = 5), data = data) # 查看模型结果 summary(model) ``` 其中,s()表示进行样条平滑,k = 5表示使用5个样条基函数。 5. 模型诊断 使用mgcv包中的plot()函数对模型进行诊断,包括残差图、Q-Q图等。可以使用以下代码实现: ``` # 残差图 plot(model, residuals = TRUE) # Q-Q图 plot(model, pch = 20) ``` 6. 模型预测 使用mgcv包中的predict()函数对模型进行预测,可以使用以下代码实现: ``` # 预测 newdata <- data.frame(Temp = seq(from = min(data$Temp), to = max(data$Temp), length.out = 100)) pred <- predict(model, newdata = newdata) # 绘制预测结果 plot(data$Temp, data$Death, xlab = "Temperature", ylab = "Death") lines(newdata$Temp, pred, col = "red", lwd = 2) ``` 以上就是以ChicagoNMMAPS数据集建立广义相加模型GAMs的详细步骤。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值