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

Stata中使用NHANES调查权重绘制等高线图的问题求助

Stata中调查数据等高线图的实现方法

Stata的twoway contour命令本身不支持直接使用权重,不管是分析权重还是抽样权重,所以你直接加[aw=wtdrd6y]会报错,这是命令本身的限制,但并非无法实现带权重的等高线图,只需换一种思路:先通过加权模型得到调整后的曲面/密度,再基于结果绘制等高线。

以下是两种针对NHANES这类复杂抽样数据的解决方案:

方案1:基于加权回归模型的预测曲面等高线

如果你的等高线是要展示dbq700随bmxbmi(BMI)和ridageyr(年龄)的加权平均变化趋势,步骤如下:

  1. 拟合加权曲面回归模型
    先拟合包含BMI、年龄及其交互项的加权回归模型(用二次项捕捉非线性关系,可根据数据调整):

    * 用分析权重拟合二次曲面模型
    regress dbq700 c.bmxbmi##c.bmxbmi c.ridageyr##c.ridageyr c.bmxbmi#c.ridageyr if cohort == 1 [aw = wtdrd6y]
    

    如果是严格的复杂抽样设计,先设置抽样权重再拟合svy模型:

    * 设置NHANES抽样设计(替换为你的psu和分层变量)
    svyset psu [pweight=wtdrd6y], strata(stratum)
    * 拟合svy调整后的曲面模型
    svy: regress dbq700 c.bmxbmi##c.bmxbmi c.ridageyr##c.ridageyr c.bmxbmi#c.ridageyr if cohort == 1
    
  2. 生成网格数据
    创建覆盖BMI和年龄取值范围的网格点,用于后续预测:

    * 获取原始数据中BMI和年龄的取值范围
    summarize bmxbmi if cohort == 1, detail
    local bmi_min = r(min)
    local bmi_max = r(max)
    summarize ridageyr if cohort == 1, detail
    local age_min = r(min)
    local age_max = r(max)
    
    * 创建100×100的网格数据集(密度可调整)
    clear
    set obs 100
    gen bmxbmi = `bmi_min' + (`bmi_max' - `bmi_min')*(_n-1)/99
    expand 100
    bysort bmxbmi: gen ridageyr = `age_min' + (`age_max' - `age_min')*(_n-1)/99
    
  3. 预测曲面值并绘制等高线
    调用之前拟合的模型预测dbq700的加权拟合值,再用twoway contour绘图:

    * 预测拟合值(svy模型用predict ..., xb)
    predict dbq700_pred
    * 绘制等高线图
    twoway contour dbq700_pred bmxbmi ridageyr
    

方案2:加权二维核密度等高线

如果你的目标是展示BMI和年龄的加权联合分布密度等高线,可以用支持权重的二维核密度命令kdensity2d(需先安装):

* 安装kdensity2d(仅首次需要)
ssc install kdensity2d
* 绘制加权二维密度等高线
kdensity2d bmxbmi ridageyr if cohort == 1 [aw=wtdrd6y], contour

这个命令会直接基于权重计算二维核密度,然后输出等高线图,适合展示加权后的变量分布特征。

内容的提问来源于stack exchange,提问作者Dr.M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:22:45