【问题标题】:"contrasts can be applied only to factors with 2 or more levels" Despite having multiple levels in each factor“对比只能应用于具有 2 个或更多水平的因素”尽管每个因素都有多个水平
【发布时间】:2020-05-03 20:43:33
【问题描述】:

我正在使用以下数据进行双向混合方差分析,使用一个因变量、一个主体间变量和一个主体内变量。当我测试因变量的残差的正态性时,我发现它们不是正态分布的。但此时我能够执行双向方差分析。但是,当我执行 log10 转换并使用 log 转换变量再次运行脚本时,我收到错误“对比度只能应用于具有 2 个或更多级别的因子”。

> str(m_runjumpFREQ)
'data.frame':   564 obs. of  8 variables:
 $ ID1            : int  1 2 3 4 5 6 7 8 9 10 ...
 $ ID             : chr  "ID1" "ID2" "ID3" "ID4" ...
 $ Group          : Factor w/ 2 levels "II","Non-II": 1 1 1 1 1 1 1 1 1 1 ...
 $ Pos            : Factor w/ 3 levels "center","forward",..: 2 1 2 3 2 2 1 3 2 2 ...
 $ Match_outcome  : Factor w/ 2 levels "W","L": 2 2 2 2 2 2 2 2 2 1 ...
 $ time           : Factor w/ 8 levels "runjump_nADJmin_q1",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ runjump        : num  0.0561 0.0858 0.0663 0.0425 0.0513 ...
 $ log_runjumpFREQ: num  -1.25 -1.07 -1.18 -1.37 -1.29 ...

StackOverflow 上对此错误的一些答案提到,用于 ANOVA 的数据集中的一个或多个因子少于两个级别。但如上所示,它们不是。 我读过的另一种解释是,这可能是缺失值的问题,其中可能存在 NA。有:

 m1_nasum <- sum(is.na(m_runjumpFREQ$log_runjumpFREQ))
> m1_nasum
[1] 88

但是,即使在删除包含 NA 的行后,我也会收到相同的错误,如下所示。

> m_runjumpFREQ <- na.omit(m_runjumpFREQ)
> m1_nasum <- sum(is.na(m_runjumpFREQ$log_runjumpFREQ))
> m1_nasum
[1] 0

我可以在不进行日志转换的情况下运行相同的脚本,并且它可以工作,但是使用它,我得到了同样的错误。无论哪种方式,因素都是相同的,缺失值不会产生影响。要么我犯了一个严重错误,要么问题出在下面的日志转换行中。

log_runjumpFREQ <- log10(m_runjumpFREQ$runjump)
m_runjumpFREQ <- cbind(m_runjumpFREQ, log_runjumpFREQ)

感谢您的帮助。

【问题讨论】:

  • 可能是您的 factor 组之一中的所有值都是 NA 。例如:lm(val ~ grp, data.frame(val=c(1:5,rep(NA,5)), grp=factor(rep(1:2,each=5)))) 失败并显示相同的错误消息。尝试制表检查,例如table(is.na(m_runjumpFREQ$log_runjumpFREQ), m_runjumpFREQ$Group) 等每个变量。如果没有要测试的确切数据,很难确定。
  • 感谢您的回答。我使用“table”函数来计算每个因素中每个级别的存在。似乎水平在每个因素中是均匀分布的。而且没有NA。我尝试在有和没有日志转换的情况下使用完全相同的脚本,并得到了日志转换脚本的错误。

标签: r normal-distribution anova


【解决方案1】:

因子有 2 个水平是不够的。此外,这些级别必须实际存在。例如,f 下面有 2 个级别,但实际上只有 1 个。

y <- (1:6)^2
x <- 1:6

f <- factor(rep(1, 6), levels = 1:2) 
nlevels(f)  # f has 2 levels
## [1] 2

lm(y ~ x + f)
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 2022-01-19
    • 2018-10-22
    • 2018-08-11
    • 2015-07-10
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多