Stata中mkspline处理日期变量时spline_before值过大的问题求助
Stata样条回归:修正袭击前后样条变量数值过大问题
问题背景
要基于恐怖袭击日期为节点构建样条回归,其中spline_before代表袭击前的访谈天数,spline_after代表袭击后的访谈天数。当前使用代码:
mkspline spline_before 20808 spline_after = interviewend
其中20808是Stata内部存储的袭击日期数值(以1960年1月1日为起始日的天数)。但spline_before的数值范围(20695-20808)过大,而spline_after运行正常——推测因为它以节点值20808为起点。尝试将interviewend转为日期格式:
gen interviewend = mdy(inwmme, inwdde, inwyye) format %td interviewend // 转换为日期显示格式
但仅改变了输出格式,Stata内部仍以原始数值计算,问题未解决。
核心原因
mkspline直接使用Stata原始日期数值时,spline_before的取值是从1960年1月1日到袭击日的累计天数,自然数值范围极大。而我们需要的是相对于袭击日的天数,而非绝对日期数值。
解决方案
先将访谈日期转换为相对于袭击日的天数,再构建样条:
- 定义袭击日期(两种方式任选其一):
// 方式1:直接用已知的Stata日期数值 local attack_date = 20808 // 方式2:用日期函数生成(更易读,示例为2017年1月1日) // local attack_date = mdy(1, 1, 2017)
- 生成相对天数变量:
gen rel_days = interviewend - `attack_date'
- 袭击当天,
rel_days = 0 - 袭击前的访谈,
rel_days为负数(数值绝对值就是距离袭击日的天数) - 袭击后的访谈,
rel_days为正数
- 基于相对天数构建样条:
mkspline spline_before 0 spline_after = rel_days
此时spline_before的范围会变成-113到0(对应原20695-20808,20808-20695=113),数值范围完全符合“袭击前天数”的需求;spline_after则从0开始,保持正常逻辑。
如果需要spline_before为正数(直接表示袭击前的天数),可以先对rel_days做条件处理:
gen spline_before_raw = cond(rel_days < 0, -rel_days, .) gen spline_after_raw = cond(rel_days >= 0, rel_days, .) // 再对两个变量分别构建样条即可
内容的提问来源于stack exchange,提问作者Lydia Sass
相关产品推荐
相关产品推荐

