Stata中使用NHANES调查权重绘制等高线图的问题求助
Stata中调查数据等高线图的实现方法
Stata的twoway contour命令本身不支持直接使用权重,不管是分析权重还是抽样权重,所以你直接加[aw=wtdrd6y]会报错,这是命令本身的限制,但并非无法实现带权重的等高线图,只需换一种思路:先通过加权模型得到调整后的曲面/密度,再基于结果绘制等高线。
以下是两种针对NHANES这类复杂抽样数据的解决方案:
方案1:基于加权回归模型的预测曲面等高线
如果你的等高线是要展示dbq700随bmxbmi(BMI)和ridageyr(年龄)的加权平均变化趋势,步骤如下:
拟合加权曲面回归模型
先拟合包含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生成网格数据
创建覆盖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预测曲面值并绘制等高线
调用之前拟合的模型预测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
相关产品推荐
相关产品推荐

