"Contrasts apply only to factors" 错误时 运行 方差分析

"Contrasts apply only to factors" error when running ANOVA

我有一个如下所示的数据框:

goal  behavior  dv1  dv2  dv3
1     1         4    2    6
1     5         3    5    1
1     7         2    4    2
5     1         5    2    7
5     5         2    1    3
5     7         2    1    2
7     1         4    5    7
7     5         2    1    4
7     7         3    2    5

如您所见,有 9 个条件(目标的 3 种可能性 x 行为的 3 种可能性)。在实际的数据集中,9 个条件中的每个条件大约有 25-30 个参与者。在这个例子中,我试图对因变量(dv1dv2dv3)进行 运行 双向 ,看看是否存在是 goalbehavior 之间的交互。

我试过 运行以下代码。 dv 是一个仅包含列 dv1dv2dv3 的矩阵。 df 是上面的整个数据框。

output <- lm(as.matrix(dv) ~ goal * behavior, data = df,
         contrasts = list(goal = contr.sum, behavior = contr.sum))
summary(aov(output))

当我尝试创建对象 output 时,出现以下错误:

Error in contrasts<-(*tmp*, value = contrasts.arg[[nn]]) :
contrasts apply only to factors

我已经查看了 this question,但仍然无法解决我的问题。当我 运行 下面的代码时,我被告知 none 我的变量被认为是因素。我不确定为什么 "goal" 和 "behavior" 都有 3 个级别,每个级别都有变化。

factor <- sapply((df), function(x) is.factor(x))

我在这里看到的其他问题专门针对

的错误消息

contrasts apply only to factors with two or more levels

这与我收到的错误消息不同。我该怎么做才能正确地把它变成 运行?

"factor" 在 R 中具有特定含义(例如参见 [​​=14=]);它们不仅仅是任何变化的变量,而是经过编码的变量,以便 R 知道它应该将它们视为分类预测变量。

在你的情况下,

df <- transform(df, goal=factor(goal), behavior=factor(behavior))

应该有效(factor()as.factor() 大致相同,使用您喜欢的任何一个)。来自评论 (df <- df %>% transmute_all(as.factor)) 的建议稍微紧凑一些,但 (1) 取决于 "tidyverse" 软件包套件(您可能不喜欢)和 (2) 更改 all 数据框中的变量进行分解(同上)。