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

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. 定义袭击日期(两种方式任选其一):
// 方式1:直接用已知的Stata日期数值
local attack_date = 20808

// 方式2:用日期函数生成(更易读,示例为2017年1月1日)
// local attack_date = mdy(1, 1, 2017)
  1. 生成相对天数变量:
gen rel_days = interviewend - `attack_date'
  • 袭击当天,rel_days = 0
  • 袭击前的访谈,rel_days为负数(数值绝对值就是距离袭击日的天数)
  • 袭击后的访谈,rel_days为正数
  1. 基于相对天数构建样条:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:43:26