Stata bootstrap命令估算nlsw88数据集hours变量中位数标准差时返回空值且缺失统计值的问题咨询
解决Stata Bootstrap估算hours中位数标准差为空的问题
我之前也碰到过类似的情况,这大概率是因为hours变量的取值过于集中(比如nlsw88数据里大量观测的hours都是40),导致bootstrap抽样的绝大多数子样本中位数完全一致,或者summarize ... detail的r(p50)在重复抽样时没被Stata正确捕获统计量的变异。
问题分析
你提到wage变量能正常运行,是因为wage是连续型变量,每个bootstrap子样本的中位数几乎不会完全相同,统计量的变异能被正常计算;但hours是整数且取值高度集中,很多子样本的中位数都是同一个值,这会让Stata在计算标准差时出现异常(返回空值)——哪怕你修改了变量存储类型也没用,核心问题是取值分布,不是存储类型。
解决方案:换一种更稳定的中位数计算方式
别再用summarize ... detail来获取中位数了,改用_pctile命令,或者自定义一个计算中位数的小程序,让bootstrap能稳定捕获统计量。
方法1:直接用_pctile命令
sysuse nlsw88, clear bootstrap r(p50), nodots: _pctile hours, p(50)
_pctile是Stata专门用于计算分位数的命令,它返回的r(p50)会更稳定,哪怕子样本中位数重复,也能正确计算标准差(如果所有子样本中位数都相同,标准差会显示为0,而不是空值)。
方法2:自定义计算中位数的程序
如果需要更灵活的控制,可以写一个小程序来计算中位数,再用bootstrap调用:
sysuse nlsw88, clear * 定义计算中位数的程序 program define get_median args var summarize `var', detail return scalar median = r(p50) end * 调用bootstrap bootstrap r(median), nodots: get_median hours
这种方式能确保每次抽样都正确捕获中位数,避免summarize命令在bootstrap环境下的潜在问题。
验证变量分布
你可以先查看hours的分布,确认取值集中的情况:
sysuse nlsw88, clear tab hours summarize hours, detail
你会发现hours的中位数是40,且大量观测都是40,这就是bootstrap返回空值的核心原因——统计量几乎没有变异。
内容的提问来源于stack exchange,提问作者Ellie.B
相关产品推荐
相关产品推荐

