Stata帮助:通过添加现有变量来填充缺失的变量

时间:2017-11-28 16:17:02

标签: loops stata

现在我的数据看起来像这样。我想要做的是用logrd [_n + 1] -avgrdgr [_n + 1]填写logrd中的缺失值。

   age avgrdgr logrd 
    -37    0.1    .
          ...
    -3    -0.2    .
    -2    -0.1    .
    -1     0.3    .
     0     0.4    .
     1     0.1    . 
     2     0.6    .
     3     0.5    1

所以结果应该是这样......

   age avgrdgr logrd 
    -37    0.1    0.3

          ...

    -3    -0.2    -0.8
    -2    -0.1    -0.9
    -1     0.3    -0.6
     0     0.4    -0.2
     1     0.1    -0.1 
     2     0.6    0.5
     3     0.5    1

我尝试通过创建这样的代码来循环它。

      foreach x of logrd & y of avgrdgr{
          if missing(`x'){
          bys cus: replace `x' = `x'[_n+1] - `y'[_n+1] 
             }
          }

这是我第一次亲自尝试创建一个循环而且我被卡住了...请帮助我。

3 个答案:

答案 0 :(得分:1)

你不需要循环。但是,由于Stata通过您的数据从第一次观察到最后一次观察,您需要暂时反转您的数据,以便后面的观察结果出现在您想要填写的早期观察之前。这里有一些代码是什么喜欢你可以使用的东西。

* Example generated by -dataex-. To install: ssc install dataex
clear
input byte age float avgrdgr float logrd
-3 -.2 .
-2 -.1 .
-1  .3 .
 0  .4 .
 1  .1 .
 2  .6 .
 3  .5 1
end
gsort -age
replace logrd = logrd[_n-1]-avgrdgr[_n-1] if missing(logrd)
sort age

结果是

. list, clean

       age   avgrdgr   logrd  
  1.    -3       -.2     -.8  
  2.    -2       -.1     -.9  
  3.    -1        .3     -.6  
  4.     0        .4     -.2  
  5.     1        .1     -.1  
  6.     2        .6      .5  
  7.     3        .5       1  

答案 1 :(得分:0)

以下数据(包括示例代码中使用但未显示在示例数据中的明显标识符)可能更像您的数据。

* Example generated by -dataex-. To install: ssc install dataex
clear
input byte(cus age) float(avgrdgr logrd)
1 -3 -.2  .
1 -2 -.1  .
1 -1  .3  .
1  0  .4  .
1  1  .1  .
1  2  .6  .
1  3  .5  1
2 -3 -.2  .
2 -2 -.1  .
2 -1  .3  .
2  0  .4  .
2  1  .1  .
2  2  .6  .
2  3  .5  0
end
generate negage = -age
bysort cus (negage): replace logrd = logrd[_n-1]-avgrdgr[_n-1] if missing(logrd)
drop negage
sort cus age

结果是

. list, sepby(cus)

     +-----------------------------+
     | cus   age   avgrdgr   logrd |
     |-----------------------------|
  1. |   1    -3       -.2     -.8 |
  2. |   1    -2       -.1     -.9 |
  3. |   1    -1        .3     -.6 |
  4. |   1     0        .4     -.2 |
  5. |   1     1        .1     -.1 |
  6. |   1     2        .6      .5 |
  7. |   1     3        .5       1 |
     |-----------------------------|
  8. |   2    -3       -.2    -1.8 |
  9. |   2    -2       -.1    -1.9 |
 10. |   2    -1        .3    -1.6 |
 11. |   2     0        .4    -1.2 |
 12. |   2     1        .1    -1.1 |
 13. |   2     2        .6     -.5 |
 14. |   2     3        .5       0 |
     +-----------------------------+

答案 2 :(得分:0)

距离合法[Activity( Label = "Sample", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, WindowSoftInputMode = SoftInput.AdjustResize, ScreenOrientation = ScreenOrientation.Portrait, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] public class MainActivity.... { ... } 语法还有很长的路要走。这很简单但至关重要的是要注意禁止foreach语法图中不允许的任何内容。 此外,请注意foreach语句并不像您期望的那样有效。每次循环循环都没有不同的评估结果。 if仅作为命令意味着if missing(whatever)

除非你的例子简化了密钥细节,否则只有一个循环,所以这应该足够了。

if missing(whatever[1])

我玩弄了扭转顺序,就像@William Lisowski的回答一样,但这个也有效。