【问题标题】:merge list of lists into one by averaging each value in lists r通过平均列表 r 中的每个值将列表列表合并为一个
【发布时间】:2014-08-05 17:28:20
【问题描述】:

所以我不太确定实现我想做的最好的方法。

这是我的问题:我在 R 中使用包小鼠的多重插补,并且我使用 cox.zph 函数来获取每个插补模型的残差。我想对所有估算的残差进行平均,以获得每个变量的一个值。老实说,我不知道如何实现这一目标。我看过 lapply 和 mapply。

res.scho <- NULL
for (i in 1:m) {
    res.scho[[i]] <- cox.zph(modf$analyses[[i]])
}

res.scho[[1]]
              rho  chisq        p
Alc=1       0.0622  0.552 4.58e-01
HIV=1       0.1050  1.873 1.71e-01
Diabetes=1 -0.1240  2.227 1.36e-01
age        -0.1388  2.877 8.99e-02
GLOBAL          NA 44.467 5.97e-08

基本上我有 m 个估算数据集和 res.scho[[m]],我想将每个 res.scho 合并为一个。

我仍然非常纠结于在其他语言中使用的 forloops,并且在使用 mapply 时遇到了一些问题。这可能是问题之一。不过,如果有人能给我一些指导以帮助我实现这一目标并更好地使用 R,我将不胜感激。

谢谢!

编辑

预期输出:

假设我有两个估算数据集。 m=2

res.scho[[1]]
              rho  chisq        p
Alc=1       0.0622  0.552 4.58e-01
HIV=1       0.1050  1.873 1.71e-01
Diabetes=1 -0.1240  2.227 1.36e-01
age        -0.1388  2.877 8.99e-02
GLOBAL          NA 44.467 5.97e-08

res.scho[[2]]
              rho  chisq        p
Alc=1       0.0522  0.752 5.58e-01
HIV=1       0.1550  1.473 2.71e-01
Diabetes=1 -0.1140  2.927 4.36e-01
age        -0.1188  2.077 3.99e-02
GLOBAL          NA 44.400 7.97e-08

我想要的输出与列表的形式相同,但每个值都是两者的平均值,例如:

 Average_res.scho
              rho  chisq        p
Alc=1       0.0572  0.652 5.08e-01
HIV=1       0.1300  1.673 2.21e-01
Diabetes=1 -0.1190  2.577 2.86e-01
age        -0.1288  2.477 4.24e-02
GLOBAL          NA 44.433 6.97e-08

比如rho的列是通过colum (res.scho[[1]] + res.scho[[2]]) /2得到的

EDIT1

按照 konvas 的建议,我正在尝试使用他的想法来获得所需的输出。这是我目前所拥有的:

rho <- NULL
chisq <- NULL
p <- NULL
for (i in 1:70) {
    rho[[i]] <- res.scho[[i]]$table[,"rho"]
    chisq[[i]] <- res.scho[[i]]$table[,"chisq"]
    p[[i]] <- res.scho[[i]]$table[,"p"]

我已经为 res.scho 的每一列提取了一个列表 - 这不是完美的解决方案。所以如果我做 rho[[1]] 我会看到第一列

 [[1]]
  CliForm=1       Sit=2       Alc=1       HIV=1  Diabetes=1         age      GLOBAL 
  0.17300198 -0.45800541  0.06224951  0.10495093 -0.12401631 -0.13879592          NA 

现在,我会为 rho、chisq 和 p 考虑这个问题:

for (i in 1:70) {
    result <- sapply(names(rho[[1]]),
             function(x) colMeans(sapply(rho, "[[", x)))
}

我得到了以下我一直在尝试解决的错误:

 Error in colMeans(sapply(rho, "[[", x)) :   'x' must be an array of at least two dimensions 

【问题讨论】:

  • cox.zph 只是测试参数的重要性。没有与该测试关联的残差,拟合值与预测值的残差与您传递给测试的模型拟合相关联。残差可能在modf$analysis 列表中。您可以使用resid(modf$analysis[[i]]) 提取它们。如果您在谈论测试统计的残差,您将必须定义您的意思。我不明白你想如何组合这些结果。
  • 感谢您的评论@MrFlick。你说得对,我应该更清楚。 cox.zph 测试 Cox 回归的比例风险假设,我希望将 m 个输出合并为一个。关键是我是在谈论残差还是测试并不重要,因为我们的想法是如何对所有这些进行平均以仅提供一个列表。我将提供预期的输出。希望这会让一切更清楚。

标签: r aggregate mean


【解决方案1】:

首先,提取列表res.scho的每个条目的相关系数矩阵:

res.scho.tables <- lapply(res.scho, `[[`, "table")

那么既然你想要的只是一个平均值(并且矩阵可以非常快地按元素相加),你可以调用

Average_res.scho <- do.call(`+`, res.scho.tables) / length(res.scho.tables)

【讨论】:

  • 嘿!感谢你的回复。您的解决方案不适用于数据,因为 res.scho 的输出比我预期的要复杂一些。 Neverthelees,我尝试过使用它(仍然不知道如何提供您提供的良好输出)。我将更新答案并尝试重现您的代码
  • @pavid 嘿,我阅读了您的编辑,也许我写答案的方式不是 100% 清楚。我一开始写的东西只是解释代码的作用,而不是你需要编写的额外代码。做你想做的代码就是result &lt;- sapply(names(res.scho[[1]]), function(x) rowMeans(sapply(res.scho, "[[", x)))
  • 所以也许我不清楚,因为代码不起作用。我没有注意到的一件事是名称“rho”等只能通过 res.scho[[i]]$table 访问,因此 names(res.scho[[1]]) 返回 NULL,因此 sapply (res.scho, "[[", x) 将不起作用。不过,如果我没记错的话,我需要一个循环,因为 names(res.scho[[1]]) 仅适用于 res.scho[[1]] 并且不会产生 res.scho 中 70 个列表的平均值.你明白我想说什么吗?希望我正确解释了问题
  • 我想我有点理解,虽然我无法复制它。 names(res.scho[[1]]) 仅用于循环遍历每个表的名称(索引 1 是任意选择的,它可以是其他任何值,因为它们都包含相同的列)。现在,为了摆脱一直调用“$table”的麻烦,如果你先调用res.scho &lt;- lapply(res.scho, "[[", "table"),然后调用result &lt;- sapply(names(res.scho[[1]]), function(x) rowMeans(sapply(res.scho, "[[", x))),是否有效?
  • 不,它不起作用。我只能得到 colnames 这样做: colnames(res.scho[[1]]$table) [1] "rho" "chisq" "p" 问题是这样的,你的函数不起作用。这就是为什么我一直在玩(没有成功)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2015-12-21
  • 2014-05-16
  • 2021-12-04
  • 1970-01-01
  • 2018-06-03
相关资源
最近更新 更多