我有一个如下所示的数据框:
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个条件(目标x 3种可能性的3种可能性)。在实际数据集中,9个条件中的每一个都有大约25-30个参与者。我试图在这个例子中对因变量(anova,dv1
和dv2
)运行双向dv3
,看看goal
和behavior
之间是否存在相互作用。
我试过运行以下代码。 dv
是一个矩阵,只包括dv1
,dv2
,dv3
列。 df
是上面的整个数据框架。
output <- lm(as.matrix(dv) ~ goal * behavior, data = df,
contrasts = list(goal = contr.sum, behavior = contr.sum))
summary(aov(output))
当我尝试创建对象output
时,我收到以下错误:
contrasts<-
中的错误(*tmp*
,value = contrasts.arg [[nn]]): 对比仅适用于因素
我看过this question,但仍然无法解决我的问题。当我运行以下代码时,我被告知没有一个变量被认为是因素。我不确定为什么这是“目标”和“行为”都有3个级别,每个级别都有变化。
factor <- sapply((df), function(x) is.factor(x))
我在这里看到的其他问题专门解决了错误信息
对比仅适用于具有两个或更多级别的因素
这与我收到的错误消息不同。我该怎么做才能让它正常运行?
“因子”在R中具有特定含义(例如参见this page from UC Berkeley);它们不仅仅是变化的任何变量,而是编码的变量,以便R知道它应该将它们视为分类预测变量。
在你的情况下,
df <- transform(df, goal=factor(goal), behavior=factor(behavior))
应该工作(factor()
和as.factor()
大致相同,使用你喜欢的任何一个)。来自评论(df <- df %>% transmute_all(as.factor)
)的建议稍微紧凑,但(1)取决于“tidyverse”套件套件(您可能不喜欢)和(2)将数据框内的所有变量更改为因子(同上)。