Time series 在Stata中插入数值而不创建新变量
我有一个纵向数据集,每个Time series 在Stata中插入数值而不创建新变量,time-series,interpolation,stata,Time Series,Interpolation,Stata,我有一个纵向数据集,每个年都有重复观察(id1,2,3…)。我有数千个各种类型的变量。某些行(由变量to_interpolate==1表示)需要根据上一年和下一年相同id的值对其数值变量进行线性插值(它们为空) 因为我不能命名所有变量,所以我创建了一个数值变量的varlist。此外,我不想重新创建数千个额外的变量,因此我需要替换现有缺少的值 到目前为止我所做的: quietly ds, has(type numeric) local varlist `r(varlist)' sort id y
年都有重复观察(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”的语法是否正确?如果没有,如何替换现有变量值而不是创建新变量
如果错误意味着我的变量列表中存在因素-如何检测它们
如果没有,如何解决这个问题
谢谢 好的,这是一个解决办法,因为我找不到一种方法来用iplate
替换值,这种方法适用于数千个变量:
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
}
这是一个线性插值法,适用于一年的时间间隔,但不是连续两年,但对于我来说已经足够了。我很高兴看到一个更好的解决方案:)正如@William Lisowski所强调的,“iplate”没有replace()
选项。任何语法图不允许的都是禁止的。无论如何,作为审计跟踪的一部分,保留原件的副本肯定是值得推荐的
sort id
quietly ds, has(type numeric)
foreach var in `r(varlist)' {
by id: ipolate `var' year, gen(`var'2)
}
您的错误消息可能是您引用本地宏r(varlist)
和var
的结果,例如'var'
,它们应该作为'var'
给出-最左边的字符是所谓的“左单引号”出现在我的键盘左上角波浪形字符下方的字符。(从技术上讲,它是ASCII“重音严重”字符。)iplate
命令不包括replace()
选项。因此,请使用3个命令执行此操作。(1) 使用iplate`var'…
生成一个名为temp的新变量;(2) replace`var'=temp
(3)drop temp
@WilliamLisowski(1)左边的“存在于我的代码中,只是在这里转录时不存在”——将修复。(2) 如何检测一个宏,或者为什么它存在于一个只有数字(3)的变量列表中,但是如何使用数千个变量来检测宏?不建议使用以下方法来覆盖宏:替换'var'='var'2
。谢谢您的回答。所有的内插值都存在于某一年内,或者以某个变量标记的任何速率(to_interpolate),进行分析不是很麻烦吗?插值为空,因此不需要积压值,并且这些行被标记。在这种情况下,生成数千个额外变量是否明智?谢谢我想你在和自己争论。你的问题说明你必须这样做,我正在解释怎么做。看结果是个好主意还是工作量太大,由你来判断。在第一条评论中,应该是drop`var'2
。