如何用Stata的npregress在指定z值处带控制变量做局部核回归?
问题描述
我之前用自定义命令kernmean做二元回归的核均值计算,代码如下:
kernmean y x if cond_a==1 & cond_b=1 & cond_c>cond_d, order(1) at(z) generate(newvar) epan bw(5)
这段命令会针对满足所有条件的观测值,使用Epanechnikov核和带宽5,在变量z的每个取值处估计局部核均值。
现在我需要在回归中加入控制变量,但kernmean不支持该功能,因此改用Stata的npregress命令,写出的代码如下:
npregress kernel y x1 x2 if cond_a==1 & cond_b=1 & cond_c>cond_d, kernel(ep) predict(newvar1 newvar2 newvar3) bwidth(5 5 5 5, copy)
但这段代码无法在变量z的每个取值处估计均值,想了解是否可以给npregress添加对应选项,或者有其他命令能实现需求?
解决方案
一、通过npregress结合predict实现指定点估计
要在npregress中实现变量z每个取值处的均值估计,需要拆分拟合和预测步骤,并利用predict的at()选项:
拟合模型时区分核心变量与控制变量
先明确核心变量(即你要做局部核估计的变量,对应原kernmean中的x)和控制变量,用controls()选项指定控制变量:npregress kernel y x1, controls(x2) if cond_a==1 & cond_b==1 & cond_c>cond_d, kernel(ep) bwidth(5 5, copy)这里假设x1是核心变量,x2是控制变量;
bwidth(5 5, copy)表示给核心变量和控制变量都设置带宽5。生成包含z所有目标取值的临时数据集
提取原数据中z的唯一取值,并给控制变量设置参考值(比如均值,或你需要的固定值):preserve clear // 提取z的唯一取值 levelsof z if cond_a==1 & cond_b==1 & cond_c>cond_d, local(z_unique) set obs `:word count `z_unique'' gen z_target = . forvalues i=1/`:word count `z_unique'' { replace z_target = `:word `i' of `z_unique'' in `i' } // 设置控制变量的参考值(以均值为例) gen x2 = `=mean(x2) if cond_a==1 & cond_b==1 & cond_c>cond_d'在指定z取值处预测核均值
使用predict的at()选项,指定核心变量取z的目标取值,生成估计结果:predict newvar, at(x1=z_target) // 将结果合并回原数据(可选) tempfile pred_results save `pred_results' restore merge m:1 z using `pred_results', keepusing(newvar) nogenerate
二、替代命令:lpoly(更简洁的单核心变量场景)
如果你的核心变量只有一个,lpoly命令更适合——它直接支持加入控制变量,且原生支持at()选项指定估计点:
lpoly y x1 if cond_a==1 & cond_b==1 & cond_c>cond_d, controls(x2) kernel(epan) bw(5) at(z) generate(newvar)
这条命令会直接生成z每个取值处的局部核均值估计,完全匹配你原kernmean加控制变量的需求。
内容的提问来源于stack exchange,提问作者swediot
相关产品推荐
相关产品推荐

