Evaluates an Expression for (Nested) Multiply Imputed Datasets

Description

Evaluates an expression for (nested) multiply imputed datasets. These functions extend the following functions: mice::with.mids, base::with, base::within.data.frame, mitools::with.imputationList.

The withPool functions try to pool estimates (by simple averaging) obtained by with or a list of results of imputed datasets.

Usage

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## S3 method for class 'mids.1chain'
with(data, expr, ...)
## S3 method for class 'datlist'
with(data, expr, fun , ...)

## S3 method for class 'mids.nmi'
with(data, expr, ...)
## S3 method for class 'nested.datlist'
with(data, expr, fun , ...)
## S3 method for class 'NestedImputationList'
with(data, expr, fun , ...)

## S3 method for class 'datlist'
within(data, expr, ...)
## S3 method for class 'imputationList'
within(data, expr, ...)

## S3 method for class 'nested.datlist'
within(data, expr, ...)
## S3 method for class 'NestedImputationList'
within(data, expr, ...)

withPool_MI(x, ...)

withPool_NMI(x, ...)

## S3 method for class 'mira.nmi'
summary(object , ...)

Arguments

data

Object of class mids.1chain, mids.nmi, imputationList or NestedImputationList

expr

Expression with a formula object.

fun

A function taking a data frame argument

...

Additional parameters to be passed to expr.

object

Object of class mira.nmi.

x

List with vectors or matrices as results of an analysis for (nested) multiply imputed datasets.

Value

with.mids.1chain: List of class mira.

with.mids.nmi: List of class mira.nmi.

with.datlist: List of class imputationResultList.

with.NestedImputationList or with.nested.datlist: List of class NestedImputationResultList.

within.imputationList: List of class imputationList.

within.NestedImputationList: List of class NestedImputationList.

withPool_MI or withPool_NMI: Vector or matrix with pooled estimates

Author(s)

Slightly modified code of mice::with.mids, mice::summary.mira, base::within.data.frame

See Also

See the corresponding functionality in base, mice, mitools and mitml packages:
mice::with.mids, mitools::with.imputationList, mitml::with.mitml.list, base::with

base::within.data.frame, mitml::within.mitml.list,

mice::summary.mira,

Imputation functions in miceadds: mice.1chain, mice.nmi

Examples

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
	
#############################################################################
# EXAMPLE 1: One chain nhanes data | application of 'with' and 'within'
#############################################################################

library(mice)
data(nhanes, package="mice")
set.seed(9090)

# nhanes data in one chain
imp <- mice.1chain( nhanes , burnin=5 , iter=40 , Nimp=4 )
# apply linear regression
res <- with( imp , expr = stats::lm( hyp ~ age + bmi  ) )
summary(res)
# pool results
summary( mice::pool(res))

# calculate some descriptive statistics
res2 <- with( imp , expr = c("M1"= mean(hyp) , "SD_age"=stats::sd(age) ) )
# pool estimates
withPool_MI(res2)

# with method for datlist
imp1 <- datlist_create(imp)
res2b <- with( imp1 , fun = function(data){ 
                    dfr <- data.frame("M" = colMeans(data) ,
                             "Q5" = apply( data, 2, stats::quantile, .05 ),   
                             "Q95" = apply( data, 2, stats::quantile, .95 ) )
                    return(dfr)
                        } )
withPool_MI(res2b)

# convert mids object into an object of class imputationList
datlist <- mids2datlist( imp )
datlist <- mitools::imputationList(datlist)

## Not run: 
# define formulas for modification of the data frames in imputationList object
datlist2 <- within( datlist , {
                     age.D3 <- 1*(age == 3)
                     hyp_chl <- hyp * chl
                        } )
# look at modified dataset
head( datlist2$imputations[[1]] )

# convert into a datlist
datlist2b <- datlist_create( datlist2 )

# apply linear model using expression
mod1a <- with( datlist2 , expr = stats::lm( hyp ~ age.D3 ) )
# do the same but now with a function argument
mod1b <- with( datlist2 , fun = function(data){
                    stats::lm( data$hyp ~ data$age.D3 ) 
                        } )                       
# apply the same model for object datlist2b
mod2a <- with( datlist2b , expr = lm( hyp ~ age.D3 ) )
mod2b <- with( datlist2b , fun = function(data){
                    stats::lm( data$hyp ~ data$age.D3 ) 
                        } )
                                        
mitools::MIcombine(mod1a)
mitools::MIcombine(mod1b)
mitools::MIcombine(mod2a)
mitools::MIcombine(mod2b)

#############################################################################
# EXAMPLE 2: Nested multiple imputation and application of with/within methods
#############################################################################

library(BIFIEsurvey)
data(data.timss2 , package="BIFIEsurvey" )
datlist <- data.timss2        

# remove first four variables
M <- length(datlist)
for (ll in 1:M){
    datlist[[ll]] <- datlist[[ll]][ , -c(1:4) ]
                }
                
# nested multiple imputation using mice
imp1 <- mice.nmi( datlist ,  m=4 , maxit=3 )
summary(imp1)
# apply linear model and use summary method for all analyses of imputed datasets
res1 <- with( imp1 , stats::lm( ASMMAT ~ migrant + female ) )	
summary(res1)

# convert mids.nmi object into an object of class NestedImputationList
datlist1 <- mids2datlist( imp1 )
datlist1 <- NestedImputationList( datlist1 )
# convert into nested.datlist object
datlist1b <- nested.datlist_create(datlist1)

# use with function
res1b <- with( datlist1 , stats::glm( ASMMAT ~ migrant + female ) )
# apply for nested.datlist
res1c <- with( datlist1b , stats::glm( ASMMAT ~ migrant + female ) )

# use within function for data transformations
datlist2 <- within( datlist1 , {
                highsc <- 1*(ASSSCI > 600)
                books_dum <- 1*(books>=3)
                rm(scsci)   # remove variable scsci
                    } )

# include random number in each dataset
N <- attr( datlist1b , "nobs")
datlist3 <- within( datlist1b , {                  
                rn <- stats::runif( N , 0, .5 )
                    } )                   
                    
#-- some applications of withPool_NMI
# mean and SD
res3a <- with( imp1 , c( "m1"= mean(ASMMAT) , "sd1" = stats::sd(ASMMAT) ) ) 
withPool_NMI(res3a)  
# quantiles
vars <- c("ASMMAT" , "lang" , "scsci")
res3b <- with( datlist1b , fun = function(data){
                dat <- data[,vars]
                res0 <- sapply( vars , FUN = function(vv){
                    stats::quantile( dat[,vv] , probs = c(.25 , .50 , .75) )        
                                    } )
                t(res0)
                    } )                                 
withPool_NMI(res3b)                                          

## End(Not run)

Questions? Problems? Suggestions? or email at ian@mutexlabs.com.

Please suggest features or report bugs with the GitHub issue tracker.

All documentation is copyright its authors; we didn't write any of that.