【问题标题】:Applying consecutive functions to a dataframe and outputting results of each into a table将连续函数应用于数据帧并将每个函数的结果输出到表中
【发布时间】:2015-05-04 16:02:11
【问题描述】:

我有一个格式与下面类似的大型数据框(运行到大约 200 个化合物)。

+-----------+----------+------------+
| Treatment | Compound | Proportion |
+-----------+----------+------------+
| A         | wax      | 0.095      |
| A         | alcohol  | 0.077      |
| A         | ketone   | 0.066      |
| B         | wax      | 0.067      |
| B         | alcohol  | 0.071      |
| B         | ketone   | 0.073      |
| C         | wax      | 0.051      |
| C         | alcohol  | 0.019      |
| C         | ketone   | 0.07       |
| D         | wax      | 0.033      |
| D         | alcohol  | 0.082      |
| D         | ketone   | 0.019      |
+-----------+----------+------------+

我在线性模型上运行了方差分析

lm(Proportion ~ Treatment) 

使用 data.table 方法为每个化合物生成一个化合物列表,其中处理是一个重要因素,将我的数据子集到“t.df”。

我现在想使用 TukeyHSD 来确定每种化合物的哪些治疗方法彼此之间存在显着差异。我意识到 TukeyHSD 需要一个“aov”输出,我需要将它包含在我的代码中。我想我想要的是一种“tapply”方法来遍历我的化合物列表、应用模型、进行 anova 然后进行 Tukeys 测试并将格式保存在矩阵列表中。

我一直在尝试使用类似以下的方法,但没有成功:

mytest <- function(x) { 
  model<-lm(Proportion ~ Treatment, data=t.df)
  aovmodel<-aov(model)
  tuks<-TukeyHSD(aovmodel) 
  } 
tapply((t.df[unique(t.df$Compound)]),mytest)

这会返回错误:

"Error in `[.data.frame`(t.df, unique(t.df$Compound)) : 
  undefined columns selected"

我认为这可能是我对这段代码最少的问题。

有没有什么方法可以提取每个测试化合物返回的 Tukey 的“p adj”值?我很想避免长期这样做,因为我的列表中有大量化合物,并预计在未来的几个数据集上使用不同的化合物名称进行类似的分析。

【问题讨论】:

  • 尝试在unique(...)之后加逗号。
  • 这样做会产生另一个错误:“unique.default(x, nmax = nmax) 中的错误:unique() 仅适用于向量”我认为“t.df$Compound”有资格作为向量? #editing 原始代码从 Compound.No 到 Compound 以匹配示例数据框
  • 示例代码中似乎存在一些问题,即:(1)在对lm的调用中,不应该将data设置为x(data = x),因为它看起来像 lm 在每次调用 mytest 时都应用于 t.df; (2) 原始数据框中没有“Compound.No”列。此外,还不清楚 t.df[unique(t,
  • @gvrocha:OP 修复了Compound.No 问题。
  • 我不确定我是否理解unique() 的意图。您是否试图仅将其应用于独特的化合物?由于每个化合物有多个记录,因此您需要确定要专门选择哪些记录。

标签: r tapply


【解决方案1】:

要获取您指定的每种化合物的 Tukey HSD,请尝试以下操作:

lapply(unique(t.df$Compound),
       function(x, df)
           TukeyHSD(aov(glm(Proportion ~ Treatment,
                            data = df,
                            subset = Compound == x)))[[1]],
       df = t.df)

对于每个独特的化合物,这会在 ANOVA 上调用 TukeyHSD(),以获取拟合对应于该化合物的数据子集的一般线性模型。它返回一个列表,其中每个元素对应一个化合物。

【讨论】:

  • 感谢 Alex A,完美运行!列表格式也可以帮助我提取 p 值。
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2022-01-14
  • 2017-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多