咨询:用lp_nl_panel函数结合虚拟变量分析非对称冲击的正确性
你的核心思路——通过0/1虚拟变量区分SS2_FNET_E的正负冲击,进而用lp_nl_panel做非对称面板局部投影分析——是符合非对称冲击识别的标准做法的,整体代码框架没问题,以下是具体的参数分析和优化建议:
一、代码核心部分的合理性分析
虚拟变量
switching的创建
你的逻辑是正确的:用if_else根据SS2_FNET_E的符号生成0/1状态变量。但不需要group_by(COUNTRY)和ungroup(),因为mutate是逐行处理观测值,分组操作不会改变结果,反而冗余,可直接简化为:df2 <- df %>% mutate(switching = if_else(SS2_FNET_E > 0, 1, 0))lp_nl_panel关键参数的合理性endog_data = "lrealGDP":正确设定被解释变量为实际GDP对数,符合产出冲击响应分析的常规设定。cumul_mult = TRUE:适合产出类变量,会生成累积脉冲响应函数(IRF),直观展示冲击对GDP的累计影响,设置合理。shock = "SS2_FNET_E":正确指定核心冲击变量。panel_model = "within"+panel_effect = "individual":采用个体固定效应模型,处理面板数据的个体异质性,是面板局部投影的标准选择。robust_cov = "vcovSCC":使用SCC标准误,能有效处理面板数据中的异方差、序列相关和截面相关问题,宏观面板分析中非常必要。switching = "switching"+use_logistic = FALSE:明确用预先定义的0/1虚拟变量作为状态变量,而非通过logistic模型估计状态,完全匹配你的研究设计(区分正负冲击),参数设置正确。lag_switching = FALSE:设定状态仅由当期冲击符号决定,若你的研究假设是“非对称响应仅取决于当期冲击方向”,这个设置合理;若需考虑状态依赖(如前期冲击符号影响当期响应),再改为TRUE即可。lags_fd_exog_data = 4+hor = 12:滞后阶数4、响应期数12都是宏观经济研究的常规选择,设置合理。confint = 1.65:对应90%置信区间,若需95%置信区间可改为1.96,根据研究需求调整即可。
二、可优化的细节
移除无效参数
gamma = 10是use_logistic = TRUE时的平滑参数,当前你关闭了logistic状态估计,该参数完全无效,建议删除以避免混淆。避免控制变量冗余
l_fd_exog_data参数会将指定变量的水平值和一阶差分都作为控制变量,而lp_nl_panel默认会包含被解释变量的滞后项(lags_endog默认值为1)。你将lrealGDP加入l_fd_exog_data会导致重复控制被解释变量的水平项,建议移除lrealGDP,仅保留冲击变量和政策变量:l_fd_exog_data = c("SS2_FNET_E", "policy_rate")若需更多滞后的被解释变量作为控制,可通过
lags_endog参数调整(如lags_endog = 4)。数据平稳性检查
局部投影方法对数据平稳性有要求,建议先对所有变量做面板单位根检验(如IPS检验):- 若变量存在单位根,需对变量做差分处理,同时将
diff_shock = TRUE。 - 若
lrealGDP是水平值(对数形式),需确认其是否平稳,否则可能导致伪回归。
- 若变量存在单位根,需对变量做差分处理,同时将
稳健性检验补充
为确保结果可靠,建议做以下稳健性检验:- 调整滞后阶数(如2、3阶)。
- 更换标准误类型(如
vcovBK)。 - 调整响应期数(如8、16期)。
三、总结
你的代码核心逻辑是正确的,通过虚拟变量区分正负冲击的非对称面板LP分析方法是成立的,调整上述细节后,结果会更严谨可靠。
内容的提问来源于stack exchange,提问作者user3227641

