回归及其 MLE
当我们把解释变量看成分类变量时,比如一个公司会不会被并购,一个公司会不会上市,你能不能考上研究生
在处理这些问题时,考虑线性概率模型P(yi =1)= β0 + β1xi 显然是不合适的。 它至少有两个致命缺陷:1.概率估计
该值可能超过1,使模型失去意义; (解决这个问题并不麻烦,我们将超过1的部分记录为1,低于0的部分记录。
部分标记为0,可以求解。这个解是有一定测量历史的tobit模型) 2.假设边际效应为常数。 一般来说,
这不符合经济学常识。 考虑边际效应递减的模型(假设真实值为蓝线),您可以看到线性模型表现不佳。
但这个函数确实非常适合贴合蓝线。 所以我们可以考虑一个回归模型:
假设有N个观测样本Y1,Y2,...,YN,设P(Yi=1|Xi)=π(Xi)为给定条件Xi下得到结果Yi=1的条件概率; 同时
相同条件下得到结果Yi=0的条件概率为P(Yi=0|Xi)=1-π(Xi),因此得到观测值的概率P(Yi)=π(Xi)Yi[ 1-π(Xi)]
1-Yi 假设每个观察都是独立的。 对于回归模型,其对数似然函数为:
然后就可以求解模型的 MLE。
2.Logit 或?
虽然该函数很好地符合边际递减模型,但我们也必须知道,S 形函数不仅仅是一个函数,它绝对是一个函数。
大多数累积分布函数都是S形的。因此,考虑F-1(P)也是一个好主意(F是标准正态分布的累积分布函数)
不错的选择。像这样,对概率P做一点变换,使变换后的取值范围合理,变换后我们可以有办法
参数估计涉及广义线性模型理论中的连接函数。 在广义线性模型中,我们称之为 log(P/(1-P)) logit,
调用F-1(P)(F为标准正态分布的累积分布函数)。那么这就涉及到一个选择问题:连接函数
我应该选择logit还是? 回归认为二元变量服从伯努利分布,所以应该选择logit,从解释的角度来看,p/
(1-p)就是我们常说的优势比,也就是软件报告中出现的OR值。
但也有其合理的一面。 首先,中心极限定理告诉我们,当样本足够多时,伯努利分布近似正态; 其次,从不确定性的角度来看,我们认为我们的线性概率模型服从正态分布。 分配也比较合理。
我们看一下变换后自变量与P的关系是什么样的:
如果你真的想知道哪种方法更适合你的数据,那是没有办法的。 您可以检查您的残差是否符合
logit 函数仍然是一致函数。 当然,你无法用肉眼分辨出来,因为这两个功能非常接近。 你可以
通过拟合优度来检验传递函数的假设。 但通常情况下,我认为没有人会坚持这么认真地对待它,因为没有必要。但有一件事是
需要注意的是,logit 模型的尾部比模型更粗,这也是经济学论文中经常使用 logit 的原因。
我们以虹膜数据中的两类数据分类为例,看看这两种分类方法有什么区别。
。
47 3
3 47
对数。
47 3
3 47
从上图和对比表可以看出,两者并没有太大的区别。
3.多项式logit和阶logit
二项式分类模型的自然扩展是多项式分类模型。
我们借鉴了神经网络中提到的XOR模型,包括:
根据上述方法,给定一个输入向量x,获得最大hθ(x)的类就是x所属的类。
选择最大的 hθ(x) 很容易理解:在类别选择问题中,无论选择什么类别,每个类别对于做出选择的经济个体都有或多或少的效用(没有效用的类别当然不会被考虑),一个类别必须脱颖而出,因为它产生最高的效用。
我们将多项式 Logit 模型的数学表达式描述如下:
假设对于第 i 个观测值,因变量 Yi 有 M 个值:1, 2,...,M,自变量为 Xi,则多项 Logit 模型为:
与回归的似然估计类似,我们可以很容易地写出多项式logit的对数似然函数
虽然多项式Logit模型很容易使用,但是从上面的描述可以看出,多项式Logit模型的最大限制是每个类别必须是
因此,可供选择的类别中,不应出现主类和次类混杂的情况。例如,在研究旅游交通时
选择时,交通类型大致可分为航空、火车、公交、私家车四类。 但如果将航空类别再细分为三个航空公司类别,
如果将公司细分为三类,得到总共六类,则多项logit模型不适用,因为航空公司、火车、公交、自用车都
大类属于同一级别,而航空公司对小类有明显区分,不应混用。 在这个例子中,
区分主要类别和次要类别很容易,但在其他研究中,如果不同级别的类别不小心混合在一起,可能就不那么容易了。
,那么多项式Logit模型得到的经验结果就会有误差。
对于分类模型,我们也会遇到被解释变量中存在分类变量的情况。 对于连续变量解释离散变量,并且解释的离散变量是序贯的(这是与多项logit最大的区别)的情况,我们需要考虑序logit模型。
其数学模型描述如下:
其中,F(.)表示累积分布函数。 当F表示正态分布的分布函数时,对应的阶数为; F代表
分发时,更改对应于顺序 logit。
与分布类似,我们可以轻松编写其对数似然函数:
4. 假人
在回归中,我们经常遇到解释变量是分类变量的情况,比如收入:高、中、低; 地区:北京、上海
、广州等。这就涉及到一个关于分类变量的问题:我们是否应该将分类变量设置为虚拟变量?
这个问题的答案在线性模型中是显而易见的,必须要做!!! 如果我们不设置虚拟变量,而只是赋值:
北京=1,上海=2,广州=3,即我们将自变量视为连续数值变量,但这只是一个代号,并不代表地区之间
存在大小顺序关系,并不意味着被解释变量(响应变量)会按此顺序线性增加或减少。 即使对于有序的多类别变量,
例如,如果将家庭收入分为高、中、低三类,则无法准确衡量各类别之间的差距。 基于编码值的分析实际上是一个强制性规则。
是等距的,显然会造成较大的误差。
但在回归中,由于logit(p)变化的特殊性,为了减少解释序数变量时的自由度(即解释变量的数量),我们常常对序数变量(如家庭收入)进行划分分为高、中、低)被视为一个连续数值变量,经济上的解释可以是XX每增加一级,相应的概率就会增加(delta(XX))(表达式还是很复杂的不会被输入)。 当然,减少变量的数量是以牺牲预测精度为代价的。 毕竟数据处理是一门艺术而不是一门技术,如何选择还要具体问题具体分析。 当然,非序数分类变量不得被视为数值变量。
5.广义线性模型的R实现
R语言提供了广义线性模型的拟合函数glm(),其调用格式如下:
glm(, = , 数据,, ,
不,开始= NULL,,,,,
=列表(...),模型= TRUE,=“glm.fit”,
x = 假,y = 真,= 空,...)
参数说明:
:回归形式,与lm()函数的参数用法一致
:设置广义线性模型连接函数的正则分布族。 glm() 提供正态、指数、伽玛、逆高斯和二项式
布。 我们的回归使用二项式分布族。 家族默认的连接函数是logit,可以设置为。
数据:数据集
用于 iris 示例的 R 代码:
逻辑拟合
=(链接='logit'),
数据 = 虹膜[51:150,])
对数。 0、''、'')
表(虹膜[51:150,5],logit。)
。合身
=(链接=''),
数据 = 虹膜[51:150,])
。 0、''、'')
表(虹膜[51:150,5],.)
该包提供多项 Logit 的模型拟合函数:
(, 数据, , ,na., 开始 = NULL,
替代。 = 空,= 空,
嵌套 = NULL,un.nest.el = FALSE,= FALSE,
= FALSE,rpar = NULL,= FALSE,
R = 40,= 假,= 空,
.nb = NULL,面板 = FALSE,= TRUE,
种子 = 10, ...)
.data(数据, , shape = c("宽","长"), = NULL,
sep =“。”,alt.var = NULL,chid.var = NULL,alt。 = NULL,id.var = NULL, = NULL, drop.index = FALSE,
= 假,...)
参数说明:
:提供条件logit、多项logit、混合logit多种模型。 多项 Logit 的估计模型应写为:因变量 ~ 0 | 自变量,如:mode ~ 0 |
data:使用.data函数使数据结构满足功能要求。
:确定分类变量是什么
形状:如果每一行都是一个观察值,我们选择宽。 如果每一行代表一个选择,那么我们应该选择 long。
alt.var:对于形状较长的数据,需要指示所有选择名称。
宽选的数据示例:
选择长的数据示例:
以数据为例来说明如何使用。
()
数据(“”,=“”)
鱼
((模式 ~ 0 | ,数据 = 鱼))
这个输出的结果与nnet包中的()函数一致。 由于该包可以做更多的logit模型,因此这里不包括nnet。
该包的介绍可以参考《R中基于书中的回归方法总结》一文。
MASS 包提供了用于 logit 或回归的 polr() 函数。 用法如下:
polr(, 数据, , 开始, ..., , na.,
= NULL,Hess = FALSE,模型 = TRUE,
= c("","","",""))
参数说明:
:回归形式,与lm()函数的参数用法一致
数据:数据集
:默认为order logit,选择后变为order model。
以data为例说明函数用法:
房子.plr
房子.plr
(房子.plr,= 3)
这些结果非常直观且易于解释,因此我们在这里省略所有输出结果。
我们来看一下手写数字的情况:
最后,我们回到手写数字的原始情况,并尝试使用多项式 Logit 重做此情况。 (本案例的描述和数据请参考“kNN算法”章节)
特征的选择可以在“神经网络”一章中找到。
由于手写数字的特征选择很容易导致回归系数矩阵的秩降低,因此我们使用nnet包的()函数代替()。
运行以下代码:
setwd("D:/R/数据//")
名字
数据
for(i in 1:(名称))
(数据[i],as.(read.fwf(名称[i],=rep(1,32))))
标签
for(i in 1:(名称)){
[一世,1]
[一世,2]
[一世,3]
[一世,4]
[一世,5]
[一世,6]
[一世,7]
[一世,8]
[一世,9]
[一世,10]
[一世,11]
[一世,12]
[一世,13]
[一世,14]
[一世,15]
[一世,16]
[一世,17]
[一世,18]
[我,19]
[一世,20]
[一世,21]
[一世,22]
[一世,23]
[一世,24]
[一世,25]
数据1
#降级时不可用
#
#m1
(网络)
米1
预测
表(预测值,标签)
sum(diag(表(pred,标签)))/(名称)
setwd("D:/R/数据//")
姓名
数据1
for(i in 1:(姓名))
(data1[i],as.(read.fwf(name[i],=rep(1,32))))
for(i in 1:(name)){
[一世,1]
[一世,2]
[一世,3]
[一世,4]
[一世,5]
[一世,6]
[一世,7]
[一世,8]
[一世,9]
[一世,10]
[一世,11]
[一世,12]
[一世,13]
[一世,14]
[一世,15]
[一世,16]
[一世,17]
[一世,18]
[我,19]
[一世,20]
[一世,21]
[一世,22]
[一世,23]
[一世,24]
[一世,25]
数据2
预测1
表(pred1,)
sum(diag(表(pred1,)))/(名称)
排序后输出结果如下:(左边是训练集,右边是测试集)
Tips:=p/1-p 相对风险指数 在模型中,P是事件A发生的概率,1-p是事件A不发生的概率,所以p/1-p是发生的相对风险和不发生。 OR值等于1表示该因素对事件A的发生没有影响; OR 值大于 1 表示事件 A 发生的可能性大于不发生的可能性; OR 值小于 1 意味着事件 A 不发生的可能性大于发生的可能性。 可能性。
:
R 中的 Logit 的 Yves: