代码之家  ›  专栏  ›  技术社区  ›  ksroogl

将MICE对象导入Stata进行分析

  •  1
  • ksroogl  · 技术社区  · 6 年前

    我试图使用在斯塔塔用老鼠创建的插补数据。

    我对这些步骤的理解是:

    1) 将mids对象转换为R中的mi

     m=20
     completed=lapply(1:20,function(i)complete(imp,i))
     completed.mi=do.call(Zelig::mi,completed)
    

    2) 正在准备要在R中导出的mice对象

    (a) mi2stata公司

     STATA=mi::mi2stata(completed.mi, m=20, file="C:\\Users\\STATA.csv", 
     missing.ind = FALSE)
     Note: after loading the data into Stata, version 11 or later, type 'mi 
     import ice' to register the data as being multiply imputed. 
     For Stata 10 and earlier, install MIM by typing 'findit mim' and include 
     'mim:' as a prefix for any command using the MI data.
     Error in lapply(X = X, FUN = FUN, ...) : 
     trying to get slot "data" from an object (class "mi") that is not an S4 
     object 
    

    (b) 按照下面的建议编写一个没有mi2stata的csv:

       data_out <- data.table::rbindlist(completed, idcol="m")
       write.csv(data_out, "C:\\deleted\\STATA2.csv", row.names=FALSE)
    

    3) 将原始非插补数据的CSV文件导入Stata

    **看起来效果不错。CSV文件中的所有变量显示在 右侧

    4) 在Stata中使用mi import ice命令

    (a) 错误re:mi2stata(我实际导入了非插补文件)

    . mi import ice STATA
    varlist not allowed
    r(101);
    

    (b) 读取CSV版本的插补数据时出错

     mi import ice[stata2]
     weights not allowed
     r(101);
    

    我遇到了2、4和1的错误(因为2的错误是指将mice对象转换为mi类数据)。我非常感谢用户友好的逐步指导。虽然mi2stata可能无法直接用于mice对象,但我仍有兴趣学习解决方案。

    2 回复  |  直到 3 年前
        1
  •  2
  •   Nick Cox    6 年前

    收集以上评论:您不能使用 mi::mi2stata 使用 Zelig::mi 或来自 mice::complete . 但是如果你看一下 mi::mi2stata ,它似乎只是堆叠原始数据和每个插补的数据集。然后添加索引来标记每个数据集和每个观察结果。

    library(mice)
    # don't really need data.table but makes adding the indices easier
    library(data.table) 
    
    # Function to export mice imputed datasets
    mice2stata <- function(imp, path="stata", type="dta"){ 
    
              completed <- lapply(seq_len(imp$m),function(i) complete(imp,i))     
              data_out <- rbindlist(completed, idcol="_mj")     
              data_out <- rbind(imp$data, data_out, fill=TRUE)     
              data_out[, `_mj` := replace(`_mj`, is.na(`_mj`), 0L)]     
              data_out[, `_mi` := rowid(`_mj`)]     
              if(type=="dta") {
    
                  foreign::write.dta(data_out, file=paste(path, type, sep="."))             
    
              } else {
    
                  write.csv(data_out, file=paste(path, type, sep="."), na="", row.names=FALSE)
              }
    
        }
    

    一个例子

    imp <- mice(nhanes, m=2, print=FALSE) 
    mice2stata(imp, type="dta")
    

    然后在Stata中使用

    use path\to\stata.dta 
    mi import ice
    
        2
  •  2
  •   Nick Cox    6 年前

    第四季度看起来很简单。该命令的语法( 功能)记录为

       mi import ice [, options]
    

    所以 STATA 看起来像是试图指定变量列表。这是从哪里来的?

    如果第二季度失败,那么第三季度和第四季度的积分是多少?

    我希望一些R用户可以在Q2上添加一些评论。表面上看,你得到了一条明确的错误信息,那么你认为这是错误的吗?