You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:42:32