Extract estimates from each dataset: MI package

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
KDT
Reply | Threaded
Open this post in threaded view
|

Extract estimates from each dataset: MI package

KDT
Dear All,
I am currently using the MI package (Su, Gelman, Hill and Yajima) to make multiple Imputations of my dataset with missing values. After fitting a model, I can use display(model) to visualize the pooled estimates as well as estimates of each imputed dataset. I can visualize these also by typing print(model).

However I would like to know how I can extract estimates of single imputed datasets. I have tried several commands for the first imputed dataset like mi.pooled$coefficients[[1]] , summary(model$analyses[[1]], etc etc but each do not work and i keep getting an error "object of type 'closure' is not subsettable"

Any one with an idea?

Trevor
Reply | Threaded
Open this post in threaded view
|

Re: Extract estimates from each dataset: MI package

Joris FA Meys
A good idea would be to read the posting guide :
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

No really, do read it. It's not there just to annoy people, it really
has a function. Getting you to understand which information we need in
order to be able to answer you, as a start.

This said:

The error occurs often when people use a name of a function as a
variable name, but the variable itself is not to be found in the
environment. No clue which name it is in your case, as I don't see any
code, don't know the data, don't know the function you used to get to
the "model".

To know what is in the object, use str(model). That tells you what is
where, how it's called, and how you get it out of the object. As mi
apparently uses S4 classes, you'll have to look around a bit.

Cheers
Joris

On Fri, Jun 18, 2010 at 10:27 AM, KDT <[hidden email]> wrote:

>
> Dear All,
> I am currently using the MI package (Su, Gelman, Hill and Yajima) to make
> multiple Imputations of my dataset with missing values. After fitting a
> model, I can use display(model) to visualize the pooled estimates as well as
> estimates of each imputed dataset. I can visualize these also by typing
> print(model).
>
> However I would like to know how I can extract estimates of single imputed
> datasets. I have tried several commands for the first imputed dataset like
> mi.pooled$coefficients[[1]] , summary(model$analyses[[1]], etc etc but each
> do not work and i keep getting an error "object of type 'closure' is not
> subsettable"
>
> Any one with an idea?
>
> Trevor
> --
> View this message in context: http://r.789695.n4.nabble.com/Extract-estimates-from-each-dataset-MI-package-tp2259864p2259864.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



--
Joris Meys
Statistical consultant

Ghent University
Faculty of Bioscience Engineering
Department of Applied mathematics, biometrics and process control

tel : +32 9 264 59 87
[hidden email]
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
KDT
Reply | Threaded
Open this post in threaded view
|

Re: Extract estimates from each dataset: MI package

KDT
Thanks Joris and pardon me for over assuming. let me add more information.
My data is very huge and it is nested with repeated measurements. This is a sample of the dataset.
     id sex lang sch      age chapt item length Resp
      1   1        0     8 27.02095       3    1      4      0
      1   1        0     8 27.02095       3    2     10      0
      1   1        0     8 27.02095       1    3     10      0
      1   1        0     8 27.02095       2    4     68      0
      1   1        0     8 27.02095       2    5     63     NA
      2   1        1     4 21.04946       3    1      4     NA
      2   1        1     4 21.04946       3    2     10      1
      2   1        1     4 21.04946       1    3     10      0
      2   1        1     4 21.04946       2    4     68     NA
      2   1        1     4 21.04946       2    5     63     NA
      3   1        0     1 29.69218       3    1      4     NA
      3   1        0     1 29.69218       3    2     10      1
      3   1        0     1 29.69218       1    3     10      1
      3   1        0     1 29.69218       2    4     68      1
      3   1        0     1 29.69218       2    5     63      1
      4   1        0     3 26.95328       3    1      4      0
      4   1        0     3 26.95328       3    2     10     NA
      4   1        0     3 26.95328       1    3     10      1
      4   1        0     3 26.95328       2    4     68      0
      4   1        0     3 26.95328       2    5     63     NA
 he imputation model  and the model I am fitting are is as follows:
imp <- mi(mydata,n.iter=6,n.imp=3, rand.imp.method="bootstrap", preprocess=F,
         run.past.convergence=F, check.coef.convergence=T,add.noise=F, post.run=F)

model <- lmer.mi(Resp~1+ sex + lang + age + length + (1|id) + (1|item)+ (1|sch) + (1|chapt),imp, family=binomial(link="logit"))
print(modelmi)
display(modelmi)

After fitting a model, I can use display(model) to visualize the pooled estimates as well as estimates of each imputed dataset. I can visualize these also by typing print(model).

However I would like to know how I can extract estimates of single imputed datasets. I have tried several commands for the first imputed dataset like mi.pooled$coefficients[[1]] , summary(model$analyses[[1]], etc etc but each do not work and i keep getting an error "object of type 'closure' is not subsettable"

Hope this makes my question clear.

Thanks

Reply | Threaded
Open this post in threaded view
|

Re: Extract estimates from each dataset: MI package

Joris FA Meys
That's indeed the information I needed. I found the solution, and I'll
explain you how I reached it as well. Once you find your way around
objects, you can solve these problems yourself rather easily. So bear
with me for a moment. If you don't know what S4 classes are, please do
a search on www.rseek.org and read the introductory material.

With showMethods() you can find which methods apply to the model
object you have :

showMethods(class=class(model))

This gives a list of formal methods, but in your case it doesn't give
any useful function for extracting individual fits. Apparently no
get-methods exist for the different slots in a mi.pooled object.

Next step is to dive into the object itself.
> str(model)
Formal class 'mi.pooled' [package "mi"] with 4 slots
  ..@ .Data    : list()
  ..@ call     : language lmer.mi(formula = y ~ x1 + x2 + (1 | x3),
mi.object = IMP)
  ..@ mi.pooled:List of 2
  .. ..$ coefficients: Named num [1:3] 1.193 0.847 0.947
  .. .. ..- attr(*, "names")= chr [1:3] "(Intercept)" "x1" "x2"
  .. ..$ se          : Named num [1:3] 0.819 0.157 0.263
  .. .. ..- attr(*, "names")= chr [1:3] "(Intercept)" "x1" "x2"
  ..@ mi.fit   :List of 3
  .. ..$ Chain1:Formal class 'mer' [package "lme4"] with 34 slots
... (tons more output)

This tells you that :
 1. the object is a formal class (and hence an S4 class). You can see
that by the @ symbol, which is used for formal objects. If the list
contains only $ symbols, then it is a pure list in the strict sense of
the word.
 2. There are 4 slots in the object. They can be objects again, or lists, or ...
 3. The slot mi.fit is a list of 3 objects, and they appear to be of
the 'mer' class. That's the S4 class which originates from the lme4
package and hence contains the fits. This is the thing you need.

I ran it on the example I found in the help files of mi, so you might
have more items in that list, but the idea stays the same.

The correct way of reaching a slot is by either using the method for
it or when that one is not there, to use the function slot() :

fits <- slot(model,"mi.fit")

This in turn gives a list of 3 fits, each fit for a chain. You can
access them by :
fits$Chain1 etc.
or
fits[[1]] etc.

Alternatively, you can use a dirty hack :

fits <- [hidden email] # gives the same list
fit1 <- [hidden email]$Chain1 # gives the fit for the first chain
...

This direct accessing of slots is advised against for a number of very
good reasons, but I found it handy in a number of cases, especially to
extract specific data in very complex objects without having to call a
number of functions.

Hope this helps.
Cheers
Joris

On Fri, Jun 18, 2010 at 12:50 PM, KDT <[hidden email]> wrote:

>
> Thanks Joris and pardon me for over assuming. let me add more information.
> My data is very huge and it is nested with repeated measurements. This is a
> sample of the dataset.
>     id sex lang sch      age chapt item length Resp
>      1   1        0     8 27.02095       3    1      4      0
>      1   1        0     8 27.02095       3    2     10      0
>      1   1        0     8 27.02095       1    3     10      0
>      1   1        0     8 27.02095       2    4     68      0
>      1   1        0     8 27.02095       2    5     63     NA
>      2   1        1     4 21.04946       3    1      4     NA
>      2   1        1     4 21.04946       3    2     10      1
>      2   1        1     4 21.04946       1    3     10      0
>      2   1        1     4 21.04946       2    4     68     NA
>      2   1        1     4 21.04946       2    5     63     NA
>      3   1        0     1 29.69218       3    1      4     NA
>      3   1        0     1 29.69218       3    2     10      1
>      3   1        0     1 29.69218       1    3     10      1
>      3   1        0     1 29.69218       2    4     68      1
>      3   1        0     1 29.69218       2    5     63      1
>      4   1        0     3 26.95328       3    1      4      0
>      4   1        0     3 26.95328       3    2     10     NA
>      4   1        0     3 26.95328       1    3     10      1
>      4   1        0     3 26.95328       2    4     68      0
>      4   1        0     3 26.95328       2    5     63     NA
>  he imputation model  and the model I am fitting are is as follows:
> imp <- mi(mydata,n.iter=6,n.imp=3, rand.imp.method="bootstrap",
> preprocess=F,
>         run.past.convergence=F, check.coef.convergence=T,add.noise=F, post.run=F)
>
> model <- lmer.mi(Resp~1+ sex + lang + age + length + (1|id) + (1|item)+
> (1|sch) + (1|chapt),imp, family=binomial(link="logit"))
> print(modelmi)
> display(modelmi)
>
> After fitting a model, I can use display(model) to visualize the pooled
> estimates as well as estimates of each imputed dataset. I can visualize
> these also by typing print(model).
>
> However I would like to know how I can extract estimates of single imputed
> datasets. I have tried several commands for the first imputed dataset like
> mi.pooled$coefficients[[1]] , summary(model$analyses[[1]], etc etc but each
> do not work and i keep getting an error "object of type 'closure' is not
> subsettable"
>
> Hope this makes my question clear.
>
> Thanks
>
>
> --
> View this message in context: http://r.789695.n4.nabble.com/Extract-estimates-from-each-dataset-MI-package-tp2259864p2260019.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



--
Joris Meys
Statistical consultant

Ghent University
Faculty of Bioscience Engineering
Department of Applied mathematics, biometrics and process control

tel : +32 9 264 59 87
[hidden email]
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
KDT
Reply | Threaded
Open this post in threaded view
|

Re: Extract estimates from each dataset: MI package

KDT
In reply to this post by KDT
Thanks Joris,
This works best for me!!! :)

Thanks once more

Trevor