R语言strip.plot()分析条区设计后,交互作用LSD检验报错求助
条区设计交互作用LSD检验报错解决
问题背景
使用agricolae包的strip.plot()完成条区设计分析后,发现fertilzier与treatment的交互作用显著,尝试用LSD.test()做多重比较时出现报错:
Error in treatment:fertilzier : NA/NaN argument In addition: Warning messages: 1: In treatment:fertilzier : numerical expression has 72 elements: only the first used 2: In treatment:fertilzier : numerical expression has 72 elements: only the first used 3: In data.frame(y, trt) : NAs introduced by coercion 4: In data.frame(y, trt) : NAs introduced by coercion
错误原因
R中:是算术取模运算符,不是用来生成交互处理组合的语法。直接写treatment:fertilzier会被当成数值取模计算,而非创建处理组合因子,导致类型不匹配和NA值。
解决方法
方法1:用interaction()生成交互因子
interaction()函数专门用来创建多因子的交互组合,是最规范的写法:
library(agricolae) # 避免使用attach(),直接用数据框引用变量 model <- strip.plot(BLOCK = dataA$rep, COL = dataA$treatment, ROW = dataA$fertilzier, Y = dataA$yield) # 生成交互处理组合 trt_interaction <- interaction(dataA$treatment, dataA$fertilzier, sep = ":") # 执行LSD检验 LSD_AB <- LSD.test(y = dataA$yield, trt = trt_interaction, DFerror = model$gl.c, MSerror = model$Ec, alpha = 0.05, p.adj = "bonferroni", group = TRUE, console = TRUE)
方法2:用paste()拼接处理名称
如果需要自定义组合格式,也可以用paste()生成字符向量后转成因子:
trt_interaction <- factor(paste(dataA$treatment, dataA$fertilzier, sep = "-")) # 后续LSD.test()代码同上
额外建议
- 尽量避免使用
attach(),它会把数据框变量加载到全局环境,容易引发变量名冲突,推荐直接用数据框$变量名的方式引用。 - 检查
fertilzier变量名是否拼写正确(注意原代码里的拼写是fertilzier而非标准的fertilizer,确保数据框中列名一致)。
内容的提问来源于stack exchange,提问作者J.K Kim
相关产品推荐
相关产品推荐

