在Stata中插值数值而不创建新变量

时间:2017-08-06 18:46:44

标签: time-series interpolation stata

我有一个纵向数据集,每个id都有反复观察(year 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. 如果没有,如何绕过这个?
  4. 谢谢!

2 个答案:

答案 0 :(得分: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) 
}

答案 1 :(得分:0)

好的,这是一种解决方法,因为我无法找到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 } 可用于数千个变量:

if(req.headers.hasOwnProperty('token')) {        
     req.headers.authorization = 'Bearer ' + req.headers.token;        
     token = req.headers.token;      
}

这是一个线性插值,适用于单年间隙,但不是连续两年,但就我的目的而言,这已经足够了。我将很高兴看到更好的解决方案:)