【问题标题】:Using R to calculate between- by within-subj ANOVA interaction contrasts using car or lme使用 R 计算使用 car 或 lme 之间的 ANOVA 交互对比
【发布时间】:2015-07-26 06:17:30
【问题描述】:

这里是心理学学生。作为我论文的一部分,我从一个实验中获得了一些数据,其中有两个受试者间 IV,classificationcondition,以及一个受试者内 IV,trial_type。数据格式为:

test = data.frame(
  ID=rep(c(1,2,3,4,5,6), each=3), 
  condition=rep(c('comp', 'seq', 'comp_text'), each=3, times=2),
  classification=rep(c('rule', 'exemplar'), each=3, length.out=18),
  trial_type=rep(c('ambig', 'unambig', 'trained'), length.out=18),
  value = c(0.25, 0.75, 1.00, 1.00, 1.00, 1.00, 0.00, 1.00, 0.75, 1.00, 1.00, 1.00, 0.25, 0.75, 0.75, 0.25, 0.75, 0.50))

我已经使用 nlme 将它们分析为方差分析,并生成 3 型 SS,因为这是我的课程所需要的

model <- lme(value~condition*classification*trial_type, 
   random=~1|ID, 
   correlation = corCompSymm(form = ~1|ID)
)
anova(model, type='marginal')

我想调查我的数据中存在的交互。具体来说,我想看看在“seq”条件下“训练”试验的值是否高于其他两个。过去,我使用“对比度”包中的 contrast() 来生成对比度矩阵,然后将其从 multcomp 包中发送到 glht()。在这种情况下,我尝试过:

cntr1 <- contrast(model, 
   a=list(condition=c('seq'), classification=c('rule','exemplar'), trial_type=c('trained')), 
   b=list(condition=c('comp','comp_text'), classification=c('rule', 'exemplar'), trial_type=c('trained'))
)

但是,这会返回

Error in testStatistic(fit, X, modelCoef, covMat, conf.int = conf.int) : 
Non-positive definite approximate variance-covariance

这似乎与方差-协方差矩阵有关,但我不确定是什么问题。

我的问题是,有没有办法解决这个问题?如果没有,有没有办法在另一个包中运行类似的对比,例如“汽车”?我可以通过转换数据使用 car 包中的 Anova 生成相同的综合 F 测试,以便每个试验类型都有自己的列,但我不确定如何使用 Anova() 测试这种交互。

【问题讨论】:

  • 您可能想查看ezAnova 包。这可以帮助你。

标签: r anova nlme


【解决方案1】:

这对你有帮助吗(如果我在某个地方误解了你,请告诉我):

  1. 您提供的test 中的组合太少,无法执行混合方差分析。所有可能的组合中的每一种都只有一个实例。为了便于说明,我对此进行了调整:

    test = data.frame( ID=rep(c(1:12), each=3), condition=rep(c('comp', 'seq', 'comp_text'), each=6, times=2), classification=rep(c('rule', 'exemplar'), each=6, length.out=18), trial_type=rep(c('ambig', 'unambig', 'trained'), length.out=18), value = round(rnorm(36),2))

  2. 我会为此使用ezANOVA,它提供了您想要的所有交互:

先重新排列数据更适合ezANOVA

ambig <- test[test$trial_type == "ambig", 'value']
unambig <- test[test$trial_type == "unambig", 'value']
trained <- test[test$trial_type == "trained", 'value']
df1 <- data.frame(ambig, unambig, trained)
df1 <- stack(df1)
subj <-  as.numeric(rep(unique(test$ID), 3))
condition <- rep(unique(test$condition), 3)
classification <- rep(unique(test$classification), 3)
df1[3] <-  subj
df1[4] <-  condition
df1[5] <- classification
colnames(df1) <- c("value", "trial_type", "id", "condition", "classification")

然后在value 上执行 3(试验类型;受试者内)乘 2(条件;受试者间)乘 2(分类;受试者间)混合方差分析。

library(ez)
mixed_aov <- ezANOVA(
  data = df1
  , dv = value
  , wid = id
  , within = trial_type
  , within_covariates = NULL
  , between = .(classification, condition)
  , observed = NULL
  , diff = NULL
  , reverse_diff = FALSE
  , type = 3
  , white.adjust = FALSE
  , detailed = F
  , return_aov = T
)

有关ezANOVA() 参数的详细信息,请参阅文档here

输出为您提供所有交互。

对于对比,您可以使用后续 t 检验。

附:还要注意您在 lme 规范 (trial_type) 中的拼写错误。

【讨论】:

  • 编辑了错字,干杯。我可能一直不清楚。我主要关心的是对比。 ezANOVA() 和 anova(model, type='marginal) 结果是相同的。我想知道是否有一种方法可以测试涉及不使用 nlme 包的受试者之间和受试者内 IV 的对比,因为(无论出于何种原因),我正在使用的数据在方差中产生错误-协方差矩阵。尽管如此,还是感谢您的详细回复!
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多