用现有观测值的相等部分填充缺失观测值(Stata)

用现有观测值的相等部分填充缺失观测值(Stata),stata,Stata,我想用下一个单元格的值填充缺失的观察值,并将其平均分布在缺失的行上 例如,使用下面的数据,我将用142填充2004m1和2004m2的值,并用142替换2004m3的值,因为我们填充了两个缺失(142=426/3)。对于2005m7/m8它将是171等。我能够用尊敬的排序和向前推进来填充缺失,但是我无法确定如何重新分配值,特别是我尝试填充的行数可能会有所不同,这并不简单[\n+1] 我尝试填充值(但这不会重新分配): 示例数据集: date_m value 2005m12 56 2005m11

我想用下一个单元格的值填充缺失的观察值,并将其平均分布在缺失的行上

例如,使用下面的数据,我将用
142
填充
2004m1
2004m2
的值,并用
142
替换
2004m3
的值,因为我们填充了两个缺失(142=426/3)。对于
2005m7/m8
它将是
171
等。我能够用尊敬的排序和
向前推进来填充缺失,但是我无法确定如何重新分配值,特别是我尝试填充的行数可能会有所不同,这并不简单
[\n+1]

我尝试填充值(但这不会重新分配):

示例数据集:

date_m  value
2005m12 56
2005m11 150
2005m10 190
2005m9  157
2005m8  342
2005m7  .
2005m6  181
2005m5  151
2005m4  107
2005m3  131
2005m2  247
2005m1  100
2004m12 77
2004m11 181
2004m10 132
2004m9  153
2004m8  380
2004m7  .
2004m6  174
2004m5  178
2004m4  104
2004m3  426
2004m2  .
2004m1  .
预期结果

date_m  value
2005m12 56
2005m11 150
2005m10 190
2005m9  157
2005m8  171
2005m7  171
2005m6  181
2005m5  151
2005m4  107
2005m3  131
2005m2  247
2005m1  100
2004m12 77
2004m11 181
2004m10 132
2004m9  153
2004m8  190
2004m7  190
2004m6  174
2004m5  178
2004m4  104
2004m3  142
2004m2  142
2004m1  142

感谢您的数据示例,这很有帮助,但如Stata tag wiki和Statalist中所述,使用
dataex
的示例更好。日期和时间变量在其他方面尤其棘手

您提到的是来自SSC的
carryforward
,许多人认为它很有用。写了关于这个问题的FAQ后,我的偏见是,大多数这样的问题都会快速而直接地产生于排序、订阅和
replace
。您的问题比大多数问题都要棘手,因为在缺失值的不可预测的间隙之后,要包含一个要分割的值

这适用于您的示例,不排除更简单的解决方案

* Example generated by -dataex-. To install: ssc install dataex
clear
input float date int mvalue
551  56
550 150
549 190
548 157
547 342
546   .
545 181
544 151
543 107
542 131
541 247
540 100
539  77
538 181
537 132
536 153
535 380
534   .
533 174
532 178
531 104
530 426
529   .
528   .
end
format %tm date

gsort -date 
gen copy = mvalue 
replace copy = copy[_n-1] if missing(copy) 

gen gap = missing(mvalue[_n+1]) | missing(mvalue)
replace gap = gap + gap[_n-1] if gap == 1 & _n > 1 
sort date 
replace gap = gap[_n-1] if inrange(gap[_n-1], 1, .)  & gap >= 1  

gen wanted = cond(gap, copy/gap, copy)

list , sepby(gap)


     +----------------------------------------+
     |    date   mvalue   copy   gap   wanted |
     |----------------------------------------|
  1. |  2004m1        .    426     3      142 |
  2. |  2004m2        .    426     3      142 |
  3. |  2004m3      426    426     3      142 |
     |----------------------------------------|
  4. |  2004m4      104    104     0      104 |
  5. |  2004m5      178    178     0      178 |
  6. |  2004m6      174    174     0      174 |
     |----------------------------------------|
  7. |  2004m7        .    380     2      190 |
  8. |  2004m8      380    380     2      190 |
     |----------------------------------------|
  9. |  2004m9      153    153     0      153 |
 10. | 2004m10      132    132     0      132 |
 11. | 2004m11      181    181     0      181 |
 12. | 2004m12       77     77     0       77 |
 13. |  2005m1      100    100     0      100 |
 14. |  2005m2      247    247     0      247 |
 15. |  2005m3      131    131     0      131 |
 16. |  2005m4      107    107     0      107 |
 17. |  2005m5      151    151     0      151 |
 18. |  2005m6      181    181     0      181 |
     |----------------------------------------|
 19. |  2005m7        .    342     2      171 |
 20. |  2005m8      342    342     2      171 |
     |----------------------------------------|
 21. |  2005m9      157    157     0      157 |
 22. | 2005m10      190    190     0      190 |
 23. | 2005m11      150    150     0      150 |
 24. | 2005m12       56     56     0       56 |
     +----------------------------------------+

太好了,非常感谢!我真的很喜欢这种简单的方法。
* Example generated by -dataex-. To install: ssc install dataex
clear
input float date int mvalue
551  56
550 150
549 190
548 157
547 342
546   .
545 181
544 151
543 107
542 131
541 247
540 100
539  77
538 181
537 132
536 153
535 380
534   .
533 174
532 178
531 104
530 426
529   .
528   .
end
format %tm date

gsort -date 
gen copy = mvalue 
replace copy = copy[_n-1] if missing(copy) 

gen gap = missing(mvalue[_n+1]) | missing(mvalue)
replace gap = gap + gap[_n-1] if gap == 1 & _n > 1 
sort date 
replace gap = gap[_n-1] if inrange(gap[_n-1], 1, .)  & gap >= 1  

gen wanted = cond(gap, copy/gap, copy)

list , sepby(gap)


     +----------------------------------------+
     |    date   mvalue   copy   gap   wanted |
     |----------------------------------------|
  1. |  2004m1        .    426     3      142 |
  2. |  2004m2        .    426     3      142 |
  3. |  2004m3      426    426     3      142 |
     |----------------------------------------|
  4. |  2004m4      104    104     0      104 |
  5. |  2004m5      178    178     0      178 |
  6. |  2004m6      174    174     0      174 |
     |----------------------------------------|
  7. |  2004m7        .    380     2      190 |
  8. |  2004m8      380    380     2      190 |
     |----------------------------------------|
  9. |  2004m9      153    153     0      153 |
 10. | 2004m10      132    132     0      132 |
 11. | 2004m11      181    181     0      181 |
 12. | 2004m12       77     77     0       77 |
 13. |  2005m1      100    100     0      100 |
 14. |  2005m2      247    247     0      247 |
 15. |  2005m3      131    131     0      131 |
 16. |  2005m4      107    107     0      107 |
 17. |  2005m5      151    151     0      151 |
 18. |  2005m6      181    181     0      181 |
     |----------------------------------------|
 19. |  2005m7        .    342     2      171 |
 20. |  2005m8      342    342     2      171 |
     |----------------------------------------|
 21. |  2005m9      157    157     0      157 |
 22. | 2005m10      190    190     0      190 |
 23. | 2005m11      150    150     0      150 |
 24. | 2005m12       56     56     0       56 |
     +----------------------------------------+