【问题标题】:How to fill in observations using other observations R or Stata如何使用其他观测值 R 或 Stata 填写观测值
【发布时间】:2018-09-18 00:36:26
【问题描述】:

我有一个这样的数据集:

ID dum1 dum2 dum3 var1
1  0    1    .    hi
1  0    .    0    hi
2  1    .    .    bye
2  0    0    1    .

我想做的是,如果缺少观察结果,我想根据相同的ID 填写信息。所以我的最终产品会是这样的:

ID dum1 dum2 dum3 var1
1  0    1    0    hi
1  0    1    0    hi
2  1    0    1    bye
2  0    0    1    bye

有什么方法可以在 R 或 Stata 中做到这一点?

【问题讨论】:

    标签: r stata


    【解决方案1】:

    这将继续讨论 Stata 解决方案。 @Pearly Spencer 的解决方案从缺失值的观察中向后和向前看,因此对于每组只有两个观察的示例很好,对于其他一些情况可能很好。

    另一种方法酌情使用来自 SSC 的社区贡献命令 mipolatestripolate,如 https://www.statalist.org/forums/forum/general-stata-discussion/general/1308786-mipolate-now-available-from-ssc-new-program-for-interpolation 中所述

    先举例,后评论:

    clear
    
    input ID dum1a dum2a dum3a str3 var1a
    1  0    1    .    "hi"
    1  0    .    0    "hi"
    2  1    .    .    "bye"
    2  0    0    1    ""
    2  0    1    .    "" 
    end
    
    gen long obsno = _n 
    
    foreach v of var dum*a { 
        quietly count if missing(`v') 
        if r(N) > 0 capture noisily mipolate `v' obsno, groupwise by(ID) generate(`v'_2) 
    }
    
    foreach v of var var*a { 
        quietly count if missing(`v') 
        if r(N) > 0 capture noisily stripolate `v' obsno, groupwise by(ID) generate(`v'_2) 
    } 
    
    list 
    
         +----------------------------------------------------------------+
         | ID   dum1a   dum2a   dum3a   var1a   obsno   dum3a_2   var1a_2 |
         |----------------------------------------------------------------|
      1. |  1       0       1       .      hi       1         0        hi |
      2. |  1       0       .       0      hi       2         0        hi |
      3. |  2       1       .       .     bye       3         1       bye |
      4. |  2       0       0       1               4         1       bye |
      5. |  2       0       1       .               5         1       bye |
         +----------------------------------------------------------------+
    

    注意事项:

    1. mipolatestripolategroupwise 选项使用以下规则:用该组中的非缺失值替换组中的缺失值当且仅当只有一个不同的非缺失值- 该组中的缺失值。因此,如果组中的非缺失值全部为 1 或全部为 42 或其他任何值,则插值使用 1 或 42 或其他任何值。如果组中的非缺失值是 0 和 1,则不行。

    2. 此处创建的变量obsno 在插值中没有任何作用,仅需要匹配mipolate 的一般语法。

    3. 这里没有假设组仅包含两个观察值或具有相同数量的观察值。解决这些问题的一个常见场景是家庭数据,只要某些变量仅针对某些家庭成员记录,但希望将记录的值传播给其他家庭成员。自然地,在实际数据中,家庭成员通常超过两个,家庭成员的数量会有所不同。

    4. 这个问题暴露了mipolate, groupwisestripolate, groupwise 中的一个小错误:如果无事可做,它不会适当退出,如dum1a 中没有缺失值。在上面的代码中,当且仅当计算缺失值时,才通过请求插值来捕获这种情况。在将来的某个日期,该错误将得到修复,并且此答案中的代码会相应地简化,或者我打算作为程序作者。

    5. mipolate, groupwisestripolate, groupwise 如果发现 any 组具有两个或多个不同的非缺失值,则会退出并显示错误消息;即使某些组很好,也不会对任何组进行插值。这就是代码capture noisily 的重点:dum2a 的错误消息没有在上面回显。作为程序作者,我正在考虑添加一个选项,这样这些组将被忽略,但对于只有一个不同的非缺失值的组将进行插值。

    【讨论】:

      【解决方案2】:

      假设你的数据在df

      library(dplyr)
      df %>%
        group_by(ID) %>% 
        mutate(dum1=dum1[dum1!="."][1], 
        dum2=dum2[dum2!="."][1], 
        dum3=dum3[dum3!="."][1], 
        var1=var1[var1!="."][1])
      

      【讨论】:

      • 假设“.”实际上缺少值/NA,您可以使用 mutate_all(~ first(na.omit(.))) 一次性改变所有变量。
      【解决方案3】:

      使用你的玩具示例:

      clear
      
      input ID dum1a dum2a dum3a str3 var1a
      1  0    1    .    "hi"
      1  0    .    0    "hi"
      2  1    .    .    "bye"
      2  0    0    1    "."
      end
      
      replace var1a = "" if var1a == "."
      
      sort ID (dum2a)
      list
      
           +------------------------------------+
           | ID   dum1a   dum2a   dum3a   var1a |
           |------------------------------------|
        1. |  1       0       1       .      hi |
        2. |  1       0       .       0      hi |
        3. |  2       0       0       1         |
        4. |  2       1       .       .     bye |
           +------------------------------------+
      

      在 Stata 中,您可以执行以下操作:

      ds ID, not
      local varlist `r(varlist)'
      
      foreach var of local varlist {
          generate `var'b = `var'
          bysort ID (`var'): replace `var'b = cond(!missing(`var'[_n-1]), `var'[_n-1], ///
                                                   `var'[_n+1]) if missing(`var')
      }
      
      list ID dum?ab var?ab
      
           +----------------------------------------+
           | ID   dum1ab   dum2ab   dum3ab   var1ab |
           |----------------------------------------|
        1. |  1        0        1        0       hi |
        2. |  1        0        1        0       hi |
        3. |  2        0        0        1      bye |
        4. |  2        1        0        1      bye |
           +----------------------------------------+
      

      【讨论】:

      • 一如既往的有用。让我为读者强调一个小细节。 Stata 不认为字符串值"." 表示缺失。这就是为什么它在这里被改为空字符串"",Stata 确实认为它丢失了。
      • 谢谢,这很有帮助。
      猜你喜欢
      • 1970-01-01
      • 2021-01-29
      • 2016-10-15
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多