将dredge函数输出转换为R中的data.frame

时间:2014-04-11 14:06:50

标签: r dataframe

我在R中使用MuMIn包为我的数据选择最佳模型。在这里,我使用随代码提供的Cement数据集的示例。

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)
}

正如您所看到的,我正在运行和迭代循环来构建数据集的模型平均估计值(为了说明,我改变了这里的长度)。变量avgmod.95返回:

> 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

包括估计参数以及下限和上限置信区间。

如何将迭代循环中的所有输出组合成一个data.frame,例如:

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

即。对于X1,X2和X3,我有三个值,其中三个是循环中的迭代次数。

如何做到这一点?我试过了:

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

但它不起作用,因为它提供了一个错误。

1 个答案:

答案 0 :(得分:1)

您要将其分配到列表中,所以让我们使用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))

现在将它变成一个很好的data.frame,使用no.of行来指示它来自哪个模型:

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

如果你在for循环中修改你的索引,你也可以给它花哨的名字,并使用它。 你的avgmod.95p将命名为this,我们可以使用它。