首页 文章

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

提问于
浏览
1

我有一个纵向数据集,每个 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);

我的问题:

  • 'replace'如何正确的语法?如果没有,如何替换现有的变量值而不是创建新的变量?

  • 如果错误意味着我的varlist中存在因素 - 如何检测它们?

  • 如果没有,怎么解决这个问题?

谢谢!

2 回答

  • 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) 
    }
    
  • 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
    }
    

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

相关问题