将 MICE 对象导入 Stata 进行分析

Importing MICE object to Stata for analysis

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

我对步骤的理解是:

1) 在R中将mids对象转换为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) 错误回复: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 class 数据)。我非常感谢用户友好的分步指导。虽然 mi2stata 可能无法直接对 mice 对象起作用,但我仍然有兴趣学习为此的解决方案。

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

   mi import ice [, options]

等等 STATA 看起来像是在尝试指定一个变量列表。那是从哪里来的?

如果Q2失败了,Q3和Q4的重点是什么?

希望有R用户能对Q2发表意见。从表面上看,您收到了一条明确的错误消息,那么您认为这是错误的吗?

收集以上评论:您不能将 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