首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据子集的成对方差分析

数据子集的成对方差分析
EN

Stack Overflow用户
提问于 2017-12-20 03:01:48
回答 2查看 1.4K关注 0票数 0

我需要在R中执行多个成对方差分析,并使用bonferroni校正p值。然而,我不需要将每个类相互比较。下面是我的数据格式和selcontrasts:我需要用它们来对比log10relquant。你们谁知道我是怎么做的吗?我使用dplyrlsmeansbroom包。

代码语言:javascript
复制
SEX      EXPERIENCED    AGE  CLASS compound    relquant log10relquant

1 FEMALE          NO     1D     1F      C14 0.004012910     -2.396541
2 FEMALE          NO     1D     1F      C14 0.003759812     -2.424834
3 FEMALE          NO     1D     1F      C14 0.003838553     -2.415832
4 FEMALE          NO     1D     1F      C14 0.003582754     -2.445783
5   MALE          NO     1D     1M      C14 0.005099237     -2.292495
6   MALE          NO     1D     1M      C14 0.005379093     -2.269291

selcontrasts <- c("1F - 1M", "4F - 4M", "4EF - 4EM", 
                  "7F - 7M", "7EF - 7EM", # sex differences
              "1M - 4M", "4M - 7M", "1M - 7M", "1F - 4F", 
              "4F - 7F", "1F - 7F", # age differences
              "4M - 4EM", "7M - 7EM", "4F - 4EF", 
              "7F - 7EF" # social experience)

x=list(selcontrasts)

目前,我使用它来配对整个数据集(因此要对每个类进行compair ),而不是选择对比度:

代码语言:javascript
复制
pvalsage=data.frame(datagr %>% 
    do( data.frame(summary(contrast(lsmeans(
          aov(log10relquant ~ CLASS, data = .), ~ CLASS ),               
          method="pairwise",adjust="none"))) ))

为了只做列表x中选定的对比度,我尝试:

代码语言:javascript
复制
pvalsage=data.frame(datagr %>%  
    do(data.frame(summary(contrast(lsmeans(
        aov(log10relquant ~ CLASS, data = .),~ CLASS),
        method = x, adjust="none"))) ))

但是我得到了一个错误:

代码语言:javascript
复制
 error in contrast.ref.grid(lsmeans(aov(log10relquant ~ CLASS, data = .),  : 
 Nonconforming number of contrast coefficients
EN

回答 2

Stack Overflow用户

发布于 2018-01-15 06:23:15

如果我正确地理解了这个问题(我很可能理解错了),那么实际上涉及三个因素:SEX (两个级别)、EXPERIENCED (两个级别)和AGE (三个级别,即1、4和7)。所需要的是对其他两个因素的每个组合的每个因素的水平进行单独比较。

如果是这样,那么将这三个因素组合为一个名为CLASS的因素只会使其更加困难,因为它使得单独跟踪这些因素的水平变得更加困难。更简单的方法是拟合一个考虑了所有三个因素的模型,估计每个因素组合的平均值,然后使用by变量进行所需的比较。因此,对于每个数据集dat,您需要执行以下操作:

代码语言:javascript
复制
require(emmeans)
mod = aov(log10relquant ~ SEX * EXPERIENCED * AGE, data = dat)
emm = emmeans(mod, ~ SEX * EXPERIENCED * AGE)
rbind(pairs(emm, by = c("EXPERIENCED", "AGE")),
      pairs(emm, by = c("SEX", "EXPERIENCED")),
      pairs(emm, by = c("SEX", "AGE")),
      adjust = "bonferroni")

我并没有试图将其嵌入到函数式编程范例中;我将把这些细节留给操作员来解决。

注意:emmeans包(估计边际均值)是lsmeans的延续,在未来将被弃用。它是以同样的方式工作的。

PS --查看问题中的代码,我担心最终结果不会显示正在比较的实际估计值(EMM),只显示比较;以及命名中的进一步含义,实际上,仅寻求P值。这让我很恼火。我不喜欢看到人们不看被测试的数量就直接去做统计测试。

票数 0
EN

Stack Overflow用户

发布于 2018-01-21 04:49:47

无论如何,您都可以进行成对对比,然后将只包含您的对比度的行过滤到一个新的数据帧中,然后是只包含您感兴趣的对比度的p.adjust= bonferroni。

或者,您可以编写一个方法函数并定义自对比,并将其用作mycontr.lmsc =

(Y)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47893568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档