KatyB
KatyB

Reputation: 3990

convert dredge function outputs to data.frame in R

I am using the MuMIn package in R to select the best model for my data. Here, I use an example using the Cement data set provided with the code.

require(MuMIn)
data(Cement)
d <- data.frame(Cement)
idx <- seq(11,13)
avgmod.95p <- list()
for (i in 1:length(idx)){
  d2 <- d[1:idx[i],]
  fm1 <- lm(y ~ ., data = d2)
  dd <- dredge(fm1, extra = c("R^2", F = function(x)
    summary(x)$fstatistic[[1]]))

  # 95% confidence set:
  confset.95p <- get.models(dd, cumsum(weight) <= .95)
  avgmod.95p[[i]] <- model.avg(confset.95p)
}

As you can see, I'm running and iteration loop to construct the model average estimate for the dataset (which I alter the length of here, for illustration). The variable avgmod.95 returns:

> avgmod.95p[[1]][3]
$avg.model
              Estimate  Std. Error Adjusted SE   Lower CI   Upper CI
(Intercept) 56.1637849 15.06079485 15.15303057 26.4643908 85.8631791
X1           1.4810616  0.14016773  0.16302190  1.1615446  1.8005787
X2           0.6850913  0.05397343  0.06358329  0.5604704  0.8097123
X4          -0.6063184  0.05919637  0.06964775 -0.7428255 -0.4698113
X3           0.2126228  0.19480789  0.23502854 -0.2480246  0.6732703

which includes the estimated parameter and the lower and upper confidence intervals.

How do I combine all of the outputs from the iteration loop into one data.frame, for example:

Variable   Estimate     Lower CI   Upper CI
   X1       1.4810616    1.1615446  1.8005787
   X1
   X1
   X2

i.e. I would have three values for X1, X2 and X3 where three is the number of iterations in the loop.

How can this be done? I have tried:

do.call(rbind.data.frame, avgmod.95p)

but it doesn't work, in the sense that it provides an error.

Upvotes: 0

Views: 1606

Answers (1)

infominer
infominer

Reputation: 2011

You are assigning it to a list, so let's use lapply

#get number of rows for each model
no.of.rows <-unlist(lapply(avgmod.95p, function(x) nrow(x$avg.model))) 
#use lapply again to rbind the models
foo<-do.call(rbind, lapply(avgmod.95p, function(x) x$avg.model))

Now make it into a nice data.frame using no.of rows to indicate which model it came from:

result.df <- data.frame(Model.No = rep(seq(1:length(no.of.rows)),no.of.rows),
                        Coefs = rownames(foo),
                        foo)

If you modify your index in the for loop, you can give it fancy names as well, and use that. your avgmod.95p will be named this and we can use that.

Upvotes: 1

Related Questions