【问题标题】:Interpolating numeric values in Stata without creating new variables在Stata中插值而不创建新变量
【发布时间】:2017-08-06 18:46:44
【问题描述】:

我有一个纵向数据集,每个 year 都有重复观察 (id 1,2,3...)。我有数千个所有类型的变量。某些行(由变量 to_interpolate == 1 表示)需要根据前几年和明年相同 id 的值对其数值变量进行线性插值(它们为空)。

由于我无法命名所有变量,因此我创建了一个 varlist 的数字变量。另外,我不想重新创建数千个额外的变量,所以我需要替换现有的缺失值。

到目前为止我做了什么:

quietly ds, has(type numeric)
local varlist `r(varlist)'

sort id year
foreach var of local varlist {
   by id: ipolate `var' year replace(`var') if to_interpolate==1
}

无论我做什么,我都会收到一条错误消息:

factor variables and time-series operators not allowed
r(101);

我的问题:

  1. “替换”的语法如何正确?如果没有,如何替换现有变量值而不是创建新变量?
  2. 如果错误意味着我的 varlist 中存在因素 - 如何检测它们?
  3. 如果没有,如何解决?

谢谢!

【问题讨论】:

  • 您的错误消息可能是您对本地宏 r(varlist)var 的引用的结果,例如 'var' 应该将它们作为 `var' 给出 - 最左边的字符是所谓的“左单引号”字符出现在我的键盘上左上角波浪字符下方。 (从技术上讲,它是 ASCII “重音”字符。)
  • ipolate 命令不包括replace() 选项。所以用3个命令来做。 (1)使用ipolate `var' ...生成一个名为temp的新变量; (2)replace `var' = temp (3)drop temp.
  • @WilliamLisowski (1) 左边的 ` 存在于我的代码中,只是在此处转录时不存在 - 将修复。 (2) 如何检测一个宏或为什么它存在于一个只有数字的 varlist 中 (3) 但是你如何使用数千个变量来做到这一点?

标签: time-series interpolation stata


【解决方案1】:

正如@William Lisowski 强调的那样,“ipolate”没有replace() 选项。它的语法图不允许的任何东西都是被禁止的。在任何情况下,保留一份原件的副本作为审计跟踪的一部分肯定是值得称赞的。

sort id 
quietly ds, has(type numeric)

foreach var in `r(varlist)' {
   by id: ipolate `var' year, gen(`var'2) 
}

【讨论】:

  • replace `var' = `var'2 后跟drop `var2' 是不推荐的覆盖方式。
  • 感谢您的回答。所有的插值都存在于某一年之内,或者以变量(to_interpolate)标记的任何速率,分析起来不是很麻烦吗?插值是空的,因此不需要积压的值,并且这些行被标记。在这种情况下,生成数千个额外变量是否谨慎?谢谢!
  • 我觉得你在和自己争论。你的问题表明你必须这样做,我正在解释如何做。看结果是好主意还是工作量太大,由你来判断。
  • 在第一条评论中,应该是drop `var'2
【解决方案2】:

好的,这是一种解决方法,因为我找不到对数千个变量可行的 replace 值与 ipolate 的方法:

quietly ds, has(type double float long int)
local varlist `r(varlist)'

sort id year

foreach var of local varlist {
   quietly by id: replace `var' = (`var'[_n-1] + `var'[_n+1])/2 if to_interpolate==1
}

这是一个线性插值,适用于单年间隔,但不适用于连续两年,但对于我的目的来说就足够了。我会很高兴看到更好的解决方案:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2017-01-11
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多