Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Maximum Likelihood Estimation in STATA

Maximum Likelihood Estimation in STATA

作者头像
宋彦
发布于 2019-07-04 03:01:17
发布于 2019-07-04 03:01:17
1.5K00
代码可运行
举报
文章被收录于专栏:一点ECON一点ECON
运行总次数:0
代码可运行

题外话:最近把网址改版了,之前文章的链接在网络上是静态html,现在改成了动态的博客类型,也会有tag分类,从电脑端阅读会方便一些。以后,网页端也会放开评论,现在还没设置。点击阅读原文即可。

_____________________________________________________________________________

STATA本身有很多estimator是通过MLE方法估计的,例如logit, probit等。在这些模型之外,STATA同时提供了ML syntax来拓展可以估计maximum likelihood模型。下面我们举例子说明ML syntax的用法。

LF Estimator

当整体样本的Log likelihood可以通过每个样本点的log likelihood累加得到时,STATA认为这类模型符合线性约束(Linear Form Restriction),可以使用STATA ML syntax中的lf方法来估计这类模型。我们将使用lf方法来估计四种常见的模型: binary logit, binary probit, OLS, and mixed logit model.

Logit Model

Log Likelihood formula for Logit Model: prob(y=1) = exp(xb)/(1+exp(xb))

Code: '''

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
program logit_lf
    args lnfj theta 
    tempvar p 
    local y $ML_y1
    quietly gen `p' = exp(`theta')/(1+exp(`theta'))
    quietly replace `lnfj' = ln(`p') if `y' == 1
    quietly replace `lnfj' = ln(1-`p') if `y' == 0
end

sysuse auto, clear
ml model lf logit_lf (eq1: foreign = weight length)
ml maximize

'''

几个要注意的点: + args 是STATA提供的一种parse的工具,是把positional argument变成指定的local。例如,ml提供的第一个argument通过args变成了local lnfj,而在剩下的程序里,都将以`lnfj'的形式出现。 + program 中的theta是所有x和系数的linear combination。这是使用lf方法最方便的地方,不需要考虑单独的系数大小,而是把系数的linear combination放在一起考虑。 + lnfj 是每个observation 的log likelihood. + $MLy1 是第一个公式中的 dependent variable,以global 的形式存在。 + 所有program 中使用的新的变量要用tempvar + ml model lf logitlf (eq1: foreign = weight length) 这一行是定义模型,即使用lf方法的logit_lf模型,模型中的y是foreign,而解释变量包括了weight和length。 + ml maximize 这一行是对上述模型进行求解,计算出对应最大loglikelihood的参数。

Probit Model

类似地,我们可以通过lf方法估计probit模型: '''

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
program probit_lf
    args theta lnfj
    local y $ML_y1
    quietly replace `lnfj' = ln(normal(`theta')) if `y' == 1
    quietly replace `lnfj' = ln(-normal(`theta')) if `y' == 0
end

'''

Linear Regression Model

线性回归模型(homoskedastic standard errors)也可以通过lf方法实现: ''' program olslf args lnfj theta std local y $MLy1 quietly replace lnfj' = ln(normalden(y', theta',std')) end

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ml model lf ols_lf (eq1: mileage = weight length) (eq2:)
* ml model lf ols_lf (eq1: mileage = weight length) /eq2 
ml maximize

'''

要注意的点:

  • Linear regression model和前面的logit probit模型不同的地方在于:线性回归模型的log likelihood不能通过一个theta(linear combination of variables)来表达,而是由两个系数同时决定的,一个是所有变量的线性组合,一个是残差项的standard deviation。因此,我们需要在写函数,和使用ml model时候都要做出相应的调整。首先,ml model 要加入第二个公式,即(eq2:)。这里,由于模型的假设包括了homoskedasticity,残差项的std不和任何解释变量相关,因此(eq2:)中不需要包括任何解释变量,只需要一个constant变量即可。
  • 当放松homoskedasticity的假设时,我们只需要稍微修改ml model中的eq2部分即可。

Mixed Binary Logit Model

Logit model虽然直观易估计,但是对于individual preference有比较强的限制。因此,我们可以估计一个mixed binary logit model,来解决这个问题。但是mixed logit model的log likelihood表达式没有closed form solution,因此只能通过simulation来解决,而STATA的ML syntax可以较好的提供simulation的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Simulate data for estimation 
/*
x~N(0,1)
beta1 = 1
beta2 ~ N(1,1)
epsilon~ extreme value distribution
y = (beta_1+ beta_2*x +epsilon>0)
*/

clear
set obs 1000
set seed 10101
gen x = rnormal()
gen beta_1 = 1
gen beta_2 = rnormal(1,1)
gen u = uniform()
gen epsilon = log(u)-log(1-u)
gen y = (beta_1 + beta_2*x+epsilon) > 0
forvalues i = 1/1000{
    quietly gen draw_`i' = uniform()
}

program mixed_logit
   args lnfj beta_1 beta_2 std 
   tempvar p sim_f sim_avg_f
   quietly gen `sim_avg_f' = 0
   quietly{
   forvalues i = 1/1000{
       gen `p' = exp(`beta'1+`beta_2'*x +  /// `std'*`draw_i'*x)/(1+exp(`beta'1+`beta_2'*x + `std'*`draw_i'*x))
       gen `sim_f' = `p' if $ML_y1 == 1
       replace `sim_f' = 1- `p' if $ML_y1 == 0
       replace `sim_avg_f` = `sim_avg_f` + `sim_f`/1000
   }
   replace `lnfj' = ln(sim_avg_f)
   }
end

ml model lf mixed_logit (beta_1:y = )(beta_2:x)(std:)
ml maximize

这里需要注意的是:

  • Log likelihood是一千次Simulation的平均。
  • 由于Log likelihood不能够通过所有变量的线性组合来表示,我们需要把系数拆分成三个部分,常数项的系数,变量X的系数的均值,变量X的std.这样的拆分不影响我们使用lf方法,因为样本的log likelihood仍然是由所有的样本的Log likelihood加总得到。

D0 Estimator

上述lf estimator只适用于样本的log likelihood仍然是由所有的样本的Log likelihood加总得到的情况,当上述条件不成立时,我们需要使用STATA提供的d0 estimator. D0 estimator的特点是我们需要在模型中提供整体样本的log likelihood,而不是每个单独样本点的log likelihood。下面我们用Conditional logit model来说明d0 estimator的用法。

Conditional Multinomial Logit Model

Model: Individual: indexed by i Choice situation: indexed by j Uij = XB+ epsilon, epsilon~extreme value distribution Log Likelihood if choice j is chosen: exp(xkb)/\sum(exp(x_jb))

Code:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cls
program drop _all
webuse choice,clear
gen japan = car==2
gen europe = car ==3 

program clogit_sch 
version 14
/* 
model: lnfi = exp(xb)/(\sum exp(xb))
*/
args todo b lnf 
tempvar xb e_xb sum_e_xb lnfj
// local group_id $ML_id 
local y $ML_y1
mleval `xb' = `b', eq(1)
sort id
quietly{
    gen `e_xb' = exp(`xb')
    bysort id: egen `sum_e_xb' = total(`e_xb')
    gen double `lnfj'   = ln(`e_xb'/`sum_e_xb')
    mlsum `lnf' = `lnfj' if `y' == 1
}
end


global ML_id id 
ml model d0 clogit_d0 (eq1: choice = dealer japan europe) 
ml check 
ml max

需要注意的是:

  • mleval: 计算系数 b'带来的linear combination的xb'。
  • mlsum: 计算所有相关的loglikelihood的总和。
  • mlcheck:用来对ml model进行debug。

和STATA提供改的asclogit的结果进行对比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
webuse choice,clear   
set more off
gen japan = car==2
gen europe = car ==3 
cd C:/Users/yan/Dropbox/college_entrance_exam/program/2018.12
program drop _all
global ML_id id 
ml model d0 clogit_sch (eq1: choice = dealer japan europe,noconstant) 
ml check 
ml max  
asclogit choice dealer, case(id) alternatives(car)

这里需要指出,asclogit会在后台生成choice specific fixed effect,而我们的estimator需要自己生成这些变量,加入到模型中,但是好处是我们的模型更加flexible。

另外几个很有用的ml command是 ml query, ml report, ml init,和 ml graph。ml query是显示目前处理的模型,包括了每条equation,变量,和系数的初始值。ml report会显示目前的系数vector, gradient vector, negative Hessian, and maximization direction。ml init用来设置模型参数的初始值,例如 ml init 1 2 -2, copy。Ml graph可以用来检测潜在的convergence issue。Newton-Rhapson 是默认的maximization routine,可以通过technique()选项来尝试其他方法,例如bhhh, dfp, and bfgs等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一点ECON 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS学习——获取iOS设备的各种信息
  不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些友好的提示和保护设备的一些设置。在Android开发中我们可以通过DeviceUtil这个工具类来获取设备网络状态、电池电量等各种状态信息,那么在iOS开发中,我们是否也能获取到设备的各种状态信息呢?答案是肯定的,本文就主要来学习一下在iOS开发过程中如何获取到设备的各种状态信息。   在iOS中要获取设备
mukekeheart
2018/03/01
3.6K0
iOS学习——获取iOS设备的各种信息
iOS锁屏时钟_ios时钟怎么调
大家好,又见面了,我是你们的朋友全栈君。 当设备在一定时间内没有触控动作,iOS会锁住屏幕。但有些应用程序是不需要锁住屏幕的,比如游戏,视频这类应用。
全栈程序员站长
2022/11/10
7560
iOS后台音频播放及锁屏歌词
1.PNG 2.PNG 主要代码如下: //后台播放音频设置,需要在Capabilities->Background Modes中勾选Audio,Airplay,and Picture in Picture AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; [session setCategory:AVAudioSessionCategoryPla
且行且珍惜_iOS
2018/05/22
1.8K0
iOS 本地推送概念步骤:属性:点击通知跳到指定控制器界面快捷回复功能(iOS 8以后可用), category 属性的使用方法
概念 1.推送通知有5种不同的呈现效果 在屏幕顶部显示一块横幅(显示具体内容) 在屏幕中间弹出一个UIAlertView(显示具体内容) 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容) 更新app图标的数字(说明新内容的数量) 播放音效(提醒作用) 2.用户也可以决定是否要开启以下4个功能: 显示App图标数字 播放音效 锁屏显示 显示在“通知中心” 3、注意: 发送推送通知时,如果程序正在前台执行,那么推送通知就不会被呈现出来,但是微信在前台的时候也能推送消息,方法是:创建一个view,仿造系统消息通
用户2141756
2018/05/18
2.8K0
iOS 音频后台播放 && 锁屏显示及控制
播放音频时,希望通知界面能显示,且能控制音频播放。由于之前需求是进入后台时播放暂停,所以每次打开通知界面时,播放就暂停,看不到类似于音乐播放器那样的效果。后来发现,去除进入后台暂停代码后,通知界面就可以显示播放器,但是不能控制、且没有进度。
莫空9081
2023/10/16
2.4K0
2021年,大厂常问iOS面试题--Runloop篇
iOS开发人群越来越少,说实在的,每次在后台看到一些读者的回应都觉得很欣慰,至少你们依然坚守iOS技术岗…为了感谢读者们,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。
猿_人类
2021/05/14
2K0
IOS13的详细适配
屏幕快照 2019-10-21 上午11.01.50.png 原因: 在iOS13中modalPresentationStyle的默认改为UIModalPresentationAutomatic,而在之前默认是UIModalPresentationFullScreen。
honey缘木鱼
2019/10/23
3.5K0
IOS13的详细适配
基础篇-iOS后台运行以及相关
对于APP的前后台运行情况的了解,有助于我们在实际开发中规避一些问题,以及采取稳妥的方法处理和解决问题,是很必须的。
進无尽
2018/09/12
5.2K0
基础篇-iOS后台运行以及相关
iOS---开发实用传感器
传感器 1.什么是传感器 传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上 2.传感器的作用 用于感应\检测设备周边的信息 不同类型的传感器, 检测的信息也不一样 iPhone中的下面现象都是由传感器完成的 在地图应用中, 能判断出手机头面向的方向 一关灯, iPhone会自动降低亮度让屏幕显得不是那么刺眼 打电话时, 人脸贴近iPhone屏幕时, 屏幕会自动锁屏, 达到省电的目的 3.传感器的类型 iPhone5中内置的传感器有 运动传感器\加速度传感器\加速计(Motion/Accelerom
用户1941540
2018/05/11
1.4K0
iOS-UIApplication详解iOS-UIApplication详解
iOS-UIApplication详解 ✨建议收藏,用到时候一查就明白了 xx_cc UIApplication简介 UIApplication对象是应用程序的象征。 每一个应用程序都有自己的UIApplication对象,而且是单例。 一个iOS程序启动后创建的第一个对象就是UIApplication对象。 通过UIApplication *app = [UIApplication sharedApplication];可以获得这个单例对象。 利用UIApplication对象能进行一些应用级别的操作。
xx_Cc
2018/05/10
1.7K0
iOS 闹钟功能实现+本地通知+音频播放
问题描述:通过picker设置时间,到了设定好的时间 闹钟响起,并弹出提示框,点击确定,停止播放音频。如果设置好了闹钟,没有停在该页面,而是返回了手机主屏幕或是手机锁屏,当到了闹钟设定的时间,会弹出消息通知。(如果设定的时间是已经过去的时间,页面不会有响应,直到设置正确的时间为止.)
好派笔记
2021/10/29
1.6K0
iOS音频播放器锁屏歌词显示与性能优化 原
    前边有博客探讨了有关iOS开发中音频播放的技术与进行后台音频播放并在后台与用户进行交互的方法,本篇将探讨一种在锁屏界面同步显示歌词歌词的方法,并在应用性能上进行一些处理。前边博客地址如下:
珲少
2018/08/15
1.2K0
iOS音频播放器锁屏歌词显示与性能优化
                                                                            原
2020年iOS开发如何获取设备的序列号与UDID
目前iOS系统对于设备的硬件信息UDID MAC地址等采用屏蔽策略,无法通过iOS设备安装App获取
大话swift
2020/02/26
6.6K1
2020年iOS开发如何获取设备的序列号与UDID
iOS 后台任务
仅当你的app是真的提供给用户音频播放功能,你才能使用音频后台模式。 若我们抱有侥幸心理,为了获得CPU更多时间而利用该模式播放一段无声的音频,apple将会拒绝此类app。 同样的当语音播放完毕之后程序同样会挂起
码客说
2019/10/22
7870
iOS创建桌面快捷方式代码
在iOS设备桌面创建app内某一个模块或页面的快捷方式,通过该快捷方式可以直接进入相应模块或页面。目前app内有该功能的有高德一键导 航,360安全卫士的小火箭。技术原理: 在iOS开发中可以使用openUrl的方式打开一个网页,并通过Safari浏览器的发送到主屏幕从而创建一个网页的快捷方式,这篇文章就是利用这个方 法来创建一个app的桌面快捷方式。首先在app内部开启一个轻量级的HttpServer,利用openurl:127.0.0.1 的方式打开本地页面,利用html的重定向将页面指向一个包含创建桌面快捷方式所有信息的,遵守data协议的url,这时利用Safari的发送到主屏 幕,就可以达到我们的要求。
好派笔记
2021/10/31
1.4K0
iOS后台音频播放及锁屏界面显示音频信息 原
后台播放是任何一个音频软件都支持的功能,在上一篇博客中,详细介绍了使用AVAudioPlayer播放音频的方法,这篇博客将对后台的处理做介绍,关于播放与设置音频的博客地址:http://my.oschina.net/u/2340880/blog/420129。
珲少
2018/08/16
3.2K0
iOS后台音频播放及锁屏界面显示音频信息
                                                                            原
ATX2 iOS设备管理平台搭建
前面分享了STF Andriod设备远程管理平台的搭建和使用 Mac OS环境搭建STF ,但是STF不支持iOS设备连接,虽然现在社区有了STF集成iOS设备的开源方案,但是经过实践不太稳定,后面在Testerhome社区发现了一个新的框架ATX2同时支持Android和iOS设备远程管理,过实践设备连接非常稳定,所以这里分享下这个平台的搭建和使用。
清风穆云
2021/08/09
2.1K1
iOS适配
首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES;
码客说
2019/10/22
1.1K0
iOS 10前后两种本地通知
远程通知是指服务器发出的通知,通过苹果的推送然后到达用户设备。本地通知是指不通过网络,直接安装应用后就可以接到通知了,典型的例子是日历、待办、闹钟等应用。
Cloudox
2021/11/23
1.3K0
iOS 10前后两种本地通知
iOS12、iOS11、iOS10、iOS9常见适配
Xcode10是默认选中的最新的New Build System(Default),在这个编译系统的环境下,不允许多个info.plist
conanma
2021/09/02
2.3K0
推荐阅读
相关推荐
iOS学习——获取iOS设备的各种信息
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验