GMM估计是用于解决内生性问题的一种方法,除此之外还有TSLS两阶段最小二乘回归。
如果存在异方差则GMM的效率会优于TSLS,但通常情况下二者结论表现一致,很多时候研究者会认为数据或多或少存在异方差问题,因而可直接使用GMM估计。
内生变量是指与误差项相关的解释变量。对应还有一个术语叫‘外生变量’,其指与误差项不相关的解释变量。产生内生性的原因通常在三类,分别说明如下:
内生性问题的判断上 ,通常是使用Durbin-Wu-Hausman检验(SPSSAU在两阶段最小二乘回归结果中默认输出),当然很多时候会结合自身理论知识和直观专业性判断是否存在内生性问题。如果假定存在内生性问题时,直接使用两阶段最小二乘回归或者GMM估计即可。一般不建议完全依照检验进行判断是否存在内生性,结合检验和专业理论知识综合判断较为可取。
内生性问题的解决上 ,通常使用工具变量法,其基本思想在于选取这样一类变量(工具变量),它们的特征为:工具变量与内生变量有着相关(如果相关性很低则称为弱工具变量),但是工具变量与被解释变量基本没有相关关系。寻找适合的工具变量是一件困难的事情,解决内生性问题时,大量的工作用于寻找适合的工具变量。
关于 引入工具变量的个数上 ,有如下说明:
过度识别和恰好识别是可以接受的,但不可识别这种情况无法进行建模,似想用一个工具变量去标识两个内生变量,这是不可以的。
工具变量引入时,有时还需要对工具变量外生性进行检验(过度识别检验),针对工具变量外生性检验上,SPSSAU提供Hansen J检验。特别提示,只有过度识别时才会输出此两个检验指标。
GMM估计类型参数说明如下:
本案例引入Mincer(1958)关于工资与受教育年限研究的数据。案例数据中包括以下信息,如下表格:
数据共有12项,其中编号为1,5,7,8,12共五项并不在考虑范畴。
本案例研究‘受教育年限’对于‘Ln工资’的影响。明显的,从理论上可能出现‘双向因果关系’即‘受教育年限’很可能是内生变量。那么可考虑使用‘母亲受教育年限’和‘成绩’这两项数据作为工具变量。同时研究时纳入3个外生变量,分别是‘婚姻’,‘是否大城市‘和’当前单位工作年限’。使用两阶段最小二乘TSLS回归进行解决内生性问题。
本案例研究时,工具变量为2个,内生变量为1个,因而为过度识别,可以正常进行TSLS回归。
关于内生性的检验Durbin-Wu-Hausman检验(SPSSAU在两阶段最小二乘回归TSLS结果中默认输出),其用于检验是否真的为内生变量;如果说检验不通过(接受原假设),那么说明没有内生变量存在,可直接使用OLS回归即可。当然即使没有内生性,一般也可以使用TSLS回归或GMM估计,没有内生性问题时,OLS回归和TSLS回归,或GMM估计结论通常一致;
关于过度识别检验上,SPSSAU提供Hansen J检验,原理上此过度识别检验仅在‘过度识别’时才会输出,即工具变量个数>内生变量个数时,才会输出。
本案例分别将被解释变量,内生变量,工具变量和外生变量纳入对应的模型框中,如下:
SPSSAU共输出5类表格,分别是研究变量类型表格,GMM估计模型分析结果表格,GMM估计模型分析结果-简化格式表格,模型汇总(中间过程)表格和过度识别检验(overidentifying restrictions)。说明如下:
上一表格展示本次研究时涉及的各变量属性,包括被解释变量,内生变量,工具变量和外生变量组成情况。
上表格列出GMM估计的最终结果,首先模型通过Wald 卡方检验(Wald χ² =272.418,p=0.000<0.05),意味着模型有效。同时R方值为0.341,意味着内生和外生变量对于工资的解释力度为34.1%。具体查看内生和外生变量对于被解释变量‘工资’的影响情况来看:
受教育年限的回归系数值为0.112(p=0.000<0.01),意味着受教育年限会对工资产生显著的正向影响关系。
婚姻(已婚为1)的回归系数值为0.168(p=0.000<0.01),意味着相对未婚群体来讲,已婚群体的工资水平明显会更高。
是否大城市(1为大城市)的回归系数值为0.145(p=0.000<0.01),意味着相对来讲,大城市样本群体,他们的工资水平明显会更高。
当前单位工作年限的回归系数值为0.036(p=0.000<0.01),意味着当前单位工作年限会对工资产生显著的正向影响关系。
总结分析可知: 受教育年限, 婚姻,是否大城市, 当前单位工作年限全部均会对工资产生显著的正向影响关系。
上表格展示模型的基础指标值,包括模型有效检验wald卡方值(此处提供wald卡方非F检验),R值,Root MSE等指标值。
过度识别检验用于检验工具变量是否为外生变量,本次研究涉及工具变量为2个,分别是‘母亲受教育年限’和‘成绩’。从上表可知,过度识别Hansen J检验显示接受原假设(p=0.868>0.05),说明无法拒绝‘工具变量外生性’这一假定,模型良好。
特别提示:
原文链接:http://tecdat.cn/?p=20882
1导言
这篇文章探讨了为什么使用广义相加模型 是一个不错的选择。为此,我们首先需要看一下线性回归,看看为什么在某些情况下它可能不是最佳选择。
2回归模型
假设我们有一些带有两个属性Y和X的数据。如果它们是线性相关的,则它们可能看起来像这样:
a<-ggplot(my_data, aes(x=X,y=Y))+geom_point()+
为了检查这种关系,我们可以使用回归模型。线性回归是一种使用X来预测变量Y的方法。将其应用于我们的数据将预测成红线的一组值:
a+geom_smooth(col="red", method="lm")+
这就是“直线方程式”。根据此等式,我们可以从直线在y轴上开始的位置(“截距”或α)开始描述,并且每个单位的x都增加了多少y(“斜率”),我们将它称为x的系数,或称为β)。还有一点自然的波动,如果没有的话,所有的点都将是完美的。我们将此称为“残差”(ϵ)。数学上是:
或者,如果我们用实际数字代替,则会得到以下结果:
这篇文章通过考虑每个数据点和线之间的差异(“残差)然后最小化这种差异来估算模型。我们在线的上方和下方都有正误差和负误差,因此,通过对它们进行平方并最小化“平方和”,使它们对于估计都为正。这称为“普通最小二乘法”或OLS。
3非线性关系如何?
因此,如果我们的数据看起来像这样,我们该怎么办:
我们刚刚看到的模型的关键假设之一是y和x线性相关。如果我们的y不是正态分布的,则使用广义线性模型 (Nelder&Wedderburn,1972),其中y通过链接函数进行变换,但再次假设f(y)和x线性相关。如果不是这种情况,并且关系在x的范围内变化,则可能不是最合适的。我们在这里有一些选择:
我们可以使用线性拟合,但是如果这样做的话,我们会在数据的某些部分上面或者下面。
我们可以分为几类。我在下面的图中使用了三个,这是一个合理的选择。同样,我们可能处于数据某些部分之下或之上,而在类别之间的边界附近似乎是准确的。例如,如果x = 49时,与x = 50相比,y是否有很大不同?
我们可以使用多项式之类的变换。下面,我使用三次多项式,因此模型适合:。这些的组合使函数可以光滑地近似变化。这是一个很好的选择,但可能会极端波动,并可能在数据中引起相关性,从而降低拟合度。
请点击输入图片描述
请点击输入图片描述
4样条曲线
多项式的进一步细化是拟合“分段”多项式,我们在数据范围内将多项式链在一起以描述形状。“样条线”是分段多项式,以绘图员用来绘制曲线的工具命名。物理样条曲线是一种柔性条,可以弯曲成形,并由砝码固定。在构造数学样条曲线时,我们有多项式函数,二阶导数连续,固定在“结”点上。
下面是一个ggplot2 对象,该 对象的 geom_smooth 的公式包含ns 函数中的“自然三次样条” 。这种样条曲线为“三次”,并且使用10个结
请点击输入图片描述
请点击输入图片描述
5光滑函数
样条曲线可以是光滑的或“摇摆的”,这可以通过改变节点数(k)或使用光滑惩罚γ来控制。如果我们增加结的数目,它将更“摇摆”。这可能会更接近数据,而且误差也会更小,但我们开始“过度拟合”关系,并拟合我们数据中的噪声。当我们结合光滑惩罚时,我们会惩罚模型中的复杂度,这有助于减少过度拟合。
请点击输入图片描述
6广义相加模型(GAM)
广义加性模型(GAM)(Hastie,1984)使用光滑函数(如样条曲线)作为回归模型中的预测因子。这些模型是严格可加的,这意味着我们不能像正常回归那样使用交互项,但是我们可以通过重新参数化作为一个更光滑的模型来实现同样的效果。事实并非如此,但本质上,我们正转向一种模型,如:
请点击输入图片描述
摘自Wood (2017)的GAM的更正式示例 是:
请点击输入图片描述
其中:
μi≡E(Yi),Y的期望
Yi〜EF(μi,ϕi),Yi是一个响应变量,根据均值μi和形状参数ϕ的指数族分布。
Ai是任何严格参数化模型分量的模型矩阵的一行,其中θ为对应的参数向量。
fi是协变量xk的光滑函数,其中k是每个函数的基础。
如果您要建立回归模型,但怀疑光滑拟合会做得更好,那么GAM是一个不错的选择。它们适合于非线性或有噪声的数据。
7 gam拟合
那么,如何 为上述S型数据建立 GAM模型?在这里,我将使用三次样条回归 :
gam(Y ~ s(X, bs="cr")上面的设置意味着:
s()指定光滑器。还有其他选项,但是s是一个很好的默认选项
bs=“cr”告诉它使用三次回归样条('basis')。
s函数计算出要使用的默认结数,但是您可以将其更改为k=10,例如10个结。
8模型输出:
查看模型摘要:
#### Family: gaussian## Link function: identity## Parametric coefficients:## Estimate Std. Error t value Pr(>|t|)## (Intercept) 43.9659 0.8305 52.94 <2e-16 ***## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1#### Approximate significance of smooth terms:## edf Ref.df F p-value## s(X) 6.087 7.143 296.3 <2e-16 ***## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1#### R-sq.(adj) = 0.876 Deviance explained = 87.9%## GCV = 211.94 Scale est. = 206.93 n = 300显示了我们截距的模型系数,所有非光滑参数将在此处显示
每个光滑项的总体含义如下。
这是基于“有效自由度”(edf)的,因为我们使用的样条函数可以扩展为许多参数,但我们也在惩罚它们并减少它们的影响。
9检查模型:
该 gam.check() 函数可用于查看残差图,但它也可以测试光滑器以查看是否有足够的结来描述数据。但是如果p值很低,则需要更多的结。
请点击输入图片描述
#### Method: GCV Optimizer: magic## Smoothing parameter selection converged after 4 iterations.## The RMS GCV score gradient at convergence was 1.107369e-05 .## The Hessian was positive definite.## 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 6.09 1.1 0.9710它比线性模型好吗?
让我们对比具有相同数据的普通线性回归模型:
anova(my_lm, my_gam)## Analysis of Variance Table#### Model 1: Y ~ X## Model 2: Y ~ s(X, bs = "cr")## Res.Df RSS Df Sum of Sq F Pr(>F)## 1 298.00 88154## 2 292.91 60613 5.0873 27540 26.161 <2.2e-16 ***## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
我们的方差分析函数在这里执行了f检验,我们的GAM模型明显优于线性回归。
11小结
所以,我们看了什么是回归模型,我们是如何解释一个变量y和另一个变量x的。其中一个基本假设是线性关系,但情况并非总是这样。当关系在x的范围内变化时,我们可以使用函数来改变这个形状。一个很好的方法是在“结”点处将光滑曲线链接在一起,我们称之为“样条曲线”
我们可以在常规回归中使用这些样条曲线,但是如果我们在GAM的背景中使用它们,我们同时估计了回归模型以及如何使我们的模型更光滑。
上面的示例显示了基于样条的GAM,其拟合度比线性回归模型好得多。
12参考:
NELDER, J. A. &WEDDERBURN, R. W. M. 1972. Generalized Linear Models. Journal of the Royal Statistical Society. Series A (General), 135, 370-384.
HARRELL, F. E., JR. 2001. Regression Modeling Strategies, New York, Springer-Verlag New York.
请点击输入图片描述
最受欢迎的见解
1.R语言多元Logistic逻辑回归 应用案例
2.面板平滑转移回归(PSTR)分析案例实现
3.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)
4.R语言泊松Poisson回归模型分析案例
5.R语言回归中的Hosmer-Lemeshow拟合优度检验
6.r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现
7.在R语言中实现Logistic逻辑回归
8.python用线性回归预测股票价格
9.R语言如何在生存分析与Cox回归中计算IDI,NRI指标
R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。
函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求平均值,求生物多样性指数等。R数据分析,就是依靠调用各种函数来完成的。但是编写函数也不是轻而易举就能完成的,需要首先经过大量的编程训练。特别是对R中数据的类型,逻辑判别、下标、循环等内容有一定了解之后,才好开始编写函数。 对于初学者来说,最好的方法就是研究现有的R函数。因为R程序包都是开源的,所有代码可见。研究现有的R函数能够使编程水平迅速提高。
R函数无需首先声明变量的类型,大部分情况下不需要进行初始化。一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分。
函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据。
2. 函数声明,包括 <- function, 即声明该对象的类型为函数。
3. 函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象。函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型。 函数体内部的程序语句进行数据处理,就是对参数的值进行处理 ,这种处理只在调用函数的时候才会发生。函数的参数可以有多种类型。R help的界面对每个函数,及其参数的意义及所需的数据类型都进行了说明。
4. 函数体
常常包括三部分.
(1). 异常处理
输入的数据不能满足函数计算的要求,或者类型不符, 这时候一定要设计相应的机制告诉用户,输入的数据在什么地方有错误。 错误又分为两种。
第一种, 如果输入的数据错误不是很严重,可以经过转换,变为符合处理要求的数据时, 此时只需要给用户一个提醒,告知数据类型不符,但是函数本身已经 进行了相应的转换。
第二种,数据完全不符合要求,这种情况下,就 要终止函数的运行,而告知因为什么,函数不能运行。这样,用户在 使用函数的情况先才不至于茫然。
(2). 运算过程
包括具体的运算步骤。 运算过程和该函数要完成的功能有关。
R运算过程中,应该尽量减少循环的使用,特别是嵌套循环。R提供了 apply,replicate等一系列函数,来代替循环,应该尽量应用这些函数, 提高效率。 如果在R中实在太慢,那么核心部分只能依靠C或者Fortran 等语言编写,然后再用R调用这些编译好的模块,达到更高的效率。
运算过程中,需要大量用到if等条件作为判别的标准。if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 is.na, is.matrix, is.numeric等等,或者对大小的比较,如,if(x >0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的。
例子:
## if与条件判断
fun.test <- function(a, b, method = "add"){
if(method == "add") { ## 如果if或者for/while;
res <- a + b ## 等后面的语句只有一行,则无需使用花括号。
}
if(method == "subtract"){
res <- a - b
}
return(res) ## 返回值
}
### 检验结果
fun.test(a = 10, b = 8, method = "add")
fun.test(a = 10, b = 8, method = "substract")