将MICE对象导入Stata进行分析

问题描述 投票:0回答:3

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

我对步骤的理解是:

1) 将 mids 对象转换为 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 importice命令

(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 的错误指的是 mouse 对象到 mi 类数据的转换)。我真的很感谢用户友好的逐步指导。尽管 mi2stata 可能无法直接用于小鼠对象,但我仍然有兴趣学习此解决方案。

r import export stata r-mice
3个回答
2
投票

收集上面的评论:您不能将

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
投票

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

   mi import ice [, options]

因此

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

如果Q2失败了,Q3和Q4还有意义吗?

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


0
投票

运行 mouse2atata 脚本时收到此错误消息,如下:

rbind(deparse.level, ...) 中的错误: 参数的列数不匹配

有人可以帮我找出上述错误消息的含义,并更正我的脚本,使其能够正常工作吗? 我是新手,如果我违反了发帖规则,请纠正我。 谢谢你,皮特医生。

#这是我在计算机上运行的脚本:

#Nick Cox 的脚本将乘法插补集写入“c:/stata”

#install.packages("data.table") 用于加载函数 rbindlist #这些行必须位于 Paul (“Pete”) Hoon 的 R 脚本之前 rm(列表=ls(全部=TRUE)) 选项(最大打印=10000000) 图书馆(米工具) 图书馆(国外) 库(并行) 库(格子) #library(VIM) R v.4.4.1 中没有软件包 VIM 图书馆(dplyr) 库(字符串) 图书馆(读者) 图书馆(小鼠) 图书馆(小鼠添加) 库(数据.表)

#Nick Cox' 2018 小鼠的 stata 函数定义如下。 #参数是imp,RAM中的一个R数据帧,由多个组成 #impated(填充)数据集,写出这些数据集的路径,第三, #要使用的文件类型。

mice2stata <- function(imp, path=("c:/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=FALSE)     
    
  •       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)
    
  •       }
    
  • }
    

#结束mice2stata功能

#使用 Nick Cox 的 nhanes 示例, #为了测试该功能,创建了三个填充的模拟数据集

小鬼<- mice(nhanes, m=3, print=FALSE)

#mice 到 Stata 的调用:

mice2stata(imp,路径=(“c:/ stata”),类型=“dta”) rbind(deparse.level, ...) 中的错误: 参数的列数不匹配

#为了将这些填充的数据集导入到 Stata 中,我们使用 #Stata命令 #mi 导入小鼠(来自 c:/stata)

#原始工作代码,如下,由 Nick Cox 于 2018 年在 Stack Overflow 上编写

#图书馆(小鼠)

实际上并不需要 data.table,但可以更轻松地添加索引

#library(数据.表)

#导出小鼠估算数据集的函数 #mice2stata <- function(imp, path="stata", type="dta"){

已完成<- lapply(seq_len(imp$m),function(i) complete(imp,i))

数据输出<- rbindlist(completed, idcol="_mj")

数据输出<- rbind(imp$data, data_out, fill=TRUE)

data_out[,
_mj
:= 替换(
_mj
, is.na(
_mj
), 0L)]

data_out[,
_mi
:= rowid(
_mj
)]

if(类型==“dta”){

foreign::write.dta(data_out, file=paste(path, type, sep="."))

}其他{

write.csv(data_out,文件=粘贴(路径,类型,sep =“。”),na =“”,row.names = FALSE)

}

}

#示例:

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

#然后在Stata中使用 #使用o\stata.dta路径 #mi进口冰

© www.soinside.com 2019 - 2024. All rights reserved.