将MICE对象导入Stata进行分析

时间:2018-04-22 10:58:09

标签: r import export stata imputation

我正在尝试使用Stata中使用MICE创建的估算数据。

我对这些步骤的理解是:

1)将中间对象转换为R

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

2)准备小鼠对象以便在R

中导出

(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的错误指的是将鼠标对象转换为mi类数据)。我非常感谢用户友好的一步一步指导。虽然mi2stata可能无法直接用于鼠标对象,但我仍然有兴趣为此学习解决方案。

2 个答案:

答案 0 :(得分:2)

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

   mi import ice [, options]

所以STATA看起来像是尝试指定变量列表。它来自哪里?

如果Q2失败,那么问题是Q3和Q4?

我希望有些R用户可以在Q2上添加一些评论。从表面上看,您收到了明确的错误消息,您认为这是错误的吗?

答案 1 :(得分:2)

收集上述评论:您不能将mi::mi2stataZelig::mimice::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