首页 > 其他分享 >11_二值选择模型

11_二值选择模型

时间:2024-05-03 22:12:43浏览次数:25  
标签:11 logit index df 模型 probit result print 二值

第11章 二值选择模型

11.1 二值选择模型的例子

  • 解释变量是离散的,不影响回归。
    • 比如虚拟变量
  • 被解释变量是离散的,不适合进行OLS回归。
    • 离散选择模型、定性反应模型
    • 最常见的:二值选择行为

定义 线性概率模型(Linear Probility Model)$$\left { \begin{array}

P(y=1|x)= F(x,\beta) \
P(y=0|x)= 1-F(x,\beta)
\end{array} \right.$$

  • 连接函数:\(F(x,\beta)\)
  • 通过选择合适的链接函数,可以保证 \(0\le \hat y \le1\) 。例如:
    • Probit模型:正态分布的累积函数$$\Phi(x'\beta)\equiv \int_{- \infty}^{x'\beta}\phi(t)dt$$
    • Logit模型:逻辑分布的累积函数$$\Lambda(x'\beta)\equiv\frac{exp(x'\beta)}{1+exp(x'\beta)}$$

Logit模型优势:逻辑分布的CDF有解释表达式,计算方便,回归系数更具经济意义

11.2 最大似然估计的原理

非线性模型,无法通过变量转换转为线性模型,常使用最大似然估计法(Maxinum Likeihood Estimate)

定义 最大似然估计法(Maxinum Likeihood Estimate)

似然函数(Likehood function)$$L(\theta\ ;\ y_1,\cdots,y_n)=\prod_{i=1}^{n}f(y_i\ ;\ \theta)$$
对数似然函数(log-Likehood function)$$\ln L(\theta\ ;y_1,\cdots,y_n) = \sum_{i=1}^{n} \ln f(y_i \ ;\ \theta)$$
给定样本取值后,该样本最有可能来自参数 \(\theta\) 为何值的总体。换言之,寻找 \(\hat \theta_{ML}\) 使得观测到样本数据的可能性最大,即最大化对数似然函数:$$\max_{\theta} \ln L(\theta\ ;\ y_1,\cdots,y_n)$$
无约束极值问题的一阶条件为:$$\frac{\partial L(\theta\ ;y_1,\cdots,y_n)}{\partial \theta} = 0$$
求解此一阶条件,即可得到最大似然估计量 \(\hat \theta_{ML}\)

MLE估计量具有良好的大样本性质,可照常进行大样本统计推断。

  • 是一致估计,\(p\lim_{n \to \infty} \hat\theta_{ML} = \theta\)
  • 服从渐近正太分布
  • 大样本下,渐近方差最小

非线性方程,通常没有解析解,只能寻找数值解。常用迭代法求数值解,高斯-牛顿法(Gauss-Newton Method)

  • 解不唯一
  • 求得的可能是局部最大值

11.3 二值选择模型的MLE估计

11.4 三种边际效应

线性模型回归系数:边际效应
非线性模型回归系数:通常不是常数,随x变化

  • 平均边际效应
  • 样本均值处边际效应
  • 某代表值处边际效应

11.5 回归系数的经济意义

对于Logit模型,回归系数意味着:

  • 几率(odds):$$\hat\beta = \frac{p}{1-p}$$
    在实际运用中还可能运用到:
  • 对数几率(log-odds):$$\ln(\hat\beta)=\ln(\frac{p}{1-p})$$
  • 几率比(odds-ratio):$$exp(\hat\beta_j) = \frac{\frac{p*}{1-P*}}{\frac{p}{1-p}}$$

11.6 拟合优度

  • 准\(R^2\)(qusai-R-square)
  • 正确预测百分比(precent correctly predicted)

11.7 准最大似然估计

11.8 三类渐近等价的大样本检验

  • (1)沃尔德检验(wald test)
  • (2)似然比检验(LR)
  • (3)拉格朗日算子检验(LM)

11.9 二值选择模型的Stata命令及实例

[[Chapter_11.ipynb]]

1. 导入数据,查看各变量的统计特征

freq字段表示,数据出现的频次

  • 这种类型的数据需要还原原始数据,不如会严重影响后续的回归结果。
import pandas as pd
import numpy as np
from cq import describe_bcmodel

# 读取数据
df = pd.read_stata('../2_Data/Data-2e/titanic.dta')
des = describe_bcmodel(df, frequency='freq')

为简化后续的步骤,借助ai生成了一个函数describe_bcmodel():

def describe_bcmodel(df, frequency, target=None, condition_col=None, condition=None):
    '''describe_bcmodel 二值模型的描述性统计,返回原始数据
    Arguments:
        df:dataframe -- 含有频次的数据集
        frequency:str --  频次的字段名
    Keyword Arguments:
        target:str -- 观测对象的字段名 (default: {None})
        condition_col:str -- 条件变量的字段名 (default: {None})
        condition:any -- 条件值 (default: {None})
    Returns:
         -- 按频次还原后的数据集
    '''
    result = df.loc[np.repeat(df.index.values, df[frequency])].drop(frequency, axis=1).reset_index(drop=True)
    if (target is None) and (condition_col is None):
        print(result.describe().T)
    else:
        result = result[[target, condition_col]][result[condition_col] == condition].drop(condition_col, axis=1).reset_index(drop=True)
        print(f'when {condition_col} is {condition}:')
        print(result.describe().T)
        return result
    return result

函数说明
np.repeat(df.index.values, df['freq'])

  • df.index.values 返回数据框的索引值,这是一个代表行号的数组。
  • df['freq'] 返回'freq'列的值,这是一个代表信息重复次数的数组。
  • np.repeat函数将行索引根据'freq'列的值进行重复,以便在最终结果中重复出现对应次数。

df.loc[]

  • df.loc 是用于按标签选择行和列的方法。在这里,它使用重复后的索引来选择数据框中的行。

.drop('freq', axis=1)

  • drop 方法用于删除数据框中的列。在这里,它删除了名为'freq'的列。参数axis=1表示删除列

.reset_index(drop=True)

  • reset_index 方法用于重置索引。参数drop=True表示删除原始索引,使新索引从零开始。这样可以确保最终结果的索引是连续的整数序列。

综合起来,这行代码的作用是将数据框中的行根据'freq'列的值重复多次,然后丢弃'freq'列,并重置索引,以得到非'freq'列的信息按照出现次数重复的结果。

2.观察不同特征下的存活率

for col in des.drop('survive', axis=1).columns:
    describe_bcmodel(df,
                     'freq',
                     target='survive',
                     condition_col=col,
                     condition=1)

3.构建OLS参照系

import statsmodels.api as sm

X = des[['class1','class2','class3','child','female']]
y = des['survive']
X = sm.add_constant(X)
model_ols = sm.OLS(y,X)
results_ols = model_ols.fit()
print(results_ols.summary())

4.使用Logit模型进行估计

sm.logit(endog, exog).fit(disp=0)

  • disp = 0 不现实迭代过程,只显示结果
  • disp = 1 显示迭代过程
model_logit = sm.Logit(y, X)
result_logit = model_logit.fit(disp=1)
print(result_logit.summary())

5.使用稳健标准误进行Logit估计

# print(model_logit.fit(cov_type='HC0').summary())
# print(model_logit.fit(cov_type='HC1').summary())
# print(model_logit.fit(cov_type='HC2').summary())
print(model_logit.fit(cov_type='HC3').summary())

6.显示Logit回归的几率比

import numpy as np

odds_ratios = np.exp(result_logit.params)
result_logit_or = pd.DataFrame({'odds ratio': odds_ratios,
                                'std err': result_logit.bse,
                                'z':result_logit.tvalues,
                                'p>|z|':result_logit.pvalues,
                                },
                               index=result_logit.params.index)
pd.set_option('display.float_format', '{:.4f}'.format)
result_logit_or

7.计算Logit模型的平均边际效应

mfx = result_logit.get_margeff()
print(mfx.summary())

8.计算均值处的平均边际效应

mfx = result_logit.get_margeff(at='mean')
print(mfx.summary())

9.准确度测量

用模型预测值与实际值进行比较,计算预测值与实际值相符的比例

predicted_classes = result_logit.predict(X) > 0.5
# 计算准确率
accuracy = (predicted_classes == y).mean()
print(f"Accuracy of the model: {accuracy*100:.2f}%")

10.数据预测

msrose = pd.DataFrame([1,1,0,0,0,1],
                      index=result_logit.params.index,columns=['MS-ROSE'])
# 两种不同的赋值方式
mrjack = pd.DataFrame({'const':1,
                       'class1':0,
                       'class2':0,
                       'class3':1,
                       'child':0,
                       'female':0},
                      index=['MR-Jack'],columns=result_logit.params.index.T)

print(result_logit.predict(msrose.T))
print(result_logit.predict(mrjack))

11.使用Probit模型进行回归

model_probit = sm.Probit(y,X)
results_probit = model_probit.fit()
print(results_probit.summary())

# 计算边际效用
mfx_probit = results_probit.get_margeff()
print(mfx_probit.summary())

# 计算准确率
predicted_classes_probit = results_probit.predict(X) > 0.5
accuracy = (predicted_classes_probit == y).mean()
print(f"Accuracy of the model: {accuracy*100:.2f}%")

# 对比 logit 和 probit 模型
df = pd.DataFrame(np.corrcoef(predicted_classes,predicted_classes_probit),index=['logit','probit'],columns=['logit','probit'])
df

11.10 其他离散选择模型

标签:11,logit,index,df,模型,probit,result,print,二值
From: https://www.cnblogs.com/watalo/p/18166953

相关文章

  • 时间序列预测模型对比——视频笔记
    Autoformer他的特点是加入了自动相关,代替原来的自注意力机制,因为作者认为数据不能简单由数值来判断,而应该根据趋势来判断。他与Dlinear一样,都是用到了decomposition,这个拆分(快速傅里叶变换FFT)基于STL(季节性,趋势性),数据=趋势性数据+季节性数据(周期)+余项auto-correlation代替注意力......
  • Codeforces 1129E Legendary Tree
    考虑让选取的集合更加特殊,不妨就让\(S=\{x\}\)。那么这个时候能发现询问\((S=\{x\},T,v)\)得到的就是以\(x\)为根时\(v\)的子树内\(T\)中的点的数量。考虑定个根,不妨为\(1\),同时令\(S=\{1\}\)。那么询问\((\{1\},\{1,\cdotsn\}\backslash\{1,x\},x)......
  • 深入 Django 模型层:数据库设计与 ORM 实践指南
    title:深入Django模型层:数据库设计与ORM实践指南date:2024/5/318:25:33updated:2024/5/318:25:33categories:后端开发tags:DjangoORM模型设计数据库关系性能优化数据安全查询操作模型继承第一章:引言Django是一个基于Python的开源Web应用程序框架,它......
  • 11.盛最多水的容器
    中等提示给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。 示例1:输入:[1,8,......
  • 【题解】P4711 「化学」相对分子质量
    Problem给定一个长度为\(L\)的化学式,求出此化学式的相对分子质量。例:十二水合硫酸铝钾(明矾)\(KAl(SO_4)_2\cdot12H_2O\).输入格式形为:KAl(SO_{4})_{2}~12H_{2}OSolve清新小模拟。定义一下“结账”这个概念,分为三种:原子结账,即为当单独的一个(一坨)原子计算完成后,计入所属......
  • 长江存储PC411 512GB SSD实测:旗舰读写性能 温度表现逆天
    一、前言:搭载长江存储PC411512GBSSD的机械革命蛟龙16S不久前我们测试过某品牌的笔记本,其搭载的PCIe4.0SSD在高负载运行时温度轻松突破70度,导致性能下降了20%左右。对于笔记本而言,由于无法像台式电脑那样给SSD安装厚重的散热装甲,在搭载高性能PCIe4.0SSD时,很容易出现温度失......
  • 对于 CF1107E 中 dp 状态设计的一点想法
    不太想发到洛谷讨论区,就往这里放了。我觉得现有的题解都没说明白为什么本题的状态和转移能覆盖所有情况,并且感觉也非常不自然,没见过的话感觉挺难发现这么一个东西。然而这个dp其实是可以自然地推导出来的。首先发现这个过程非常难以描述,主要原因在于很难刻画一个局面。然而,如......
  • NOISEDIFFUSION: 改进基于扩散模型的球面线性插值
    Motivation:1.改进自然图像的插值质量:现有的图像插值方法,尤其是那些基于扩散模型的方法,通常在处理非模型生成的自然图像时遇到困难。这些方法往往不能有效地处理自然图像中的复杂和多样的噪声分布,导致插值结果不自然或有明显的图像伪影。2.处理编码噪声的无效性:在图像插值过程......
  • 迁移学习讲解、举例基于resnet-50 backbone的YOLO v1模型
    一、概念介绍迁移学习是指通过将一个已经在某一任务上训练好的模型,应用于另一个任务上。在迁移学习中,一般会将预训练模型的权重加载到新的模型中,然后对新的模型进行微调。预训练模型是指在大规模的数据集上训练好的模型这些模型通常具有很好的泛化能力,可以应用于各种任务,如图......
  • 华为平板(metapad 11.5 2023款)电脑传不了文件
    打电话前做了如下尝试1.版本号8下开开发者模式,去开发者模式开adb调试和usb模式调为MTP2.开启hdb(开启后ADB调试可能会关闭?建议最好再去看一眼)3.下载了华为手机助手(windows版本)接着搞不定打电话(950800)摇人让我做了以下尝试就好了1.换接口+换线(我无法确......