R中设置posmat列名后调用summary()出现重复行名错误求助
问题原因分析与解决方法
嘿,我来帮你拆解这个错误的根源!你遇到的duplicate 'row.names' are not allowed错误,核心原因是对比矩阵posmat的行名和database$Pos因子的水平名不匹配,导致lmerTest的summary()函数在生成结果表格时出现了行名冲突。
具体细节:
- 你通过
pseudoinverse(posmat.temp)生成的posmat,默认行名是V1到V8(来自posmat.temp的列名),但你的database$Pos因子的水平是"1"到"8",两者完全不对应。 - 虽然R拟合模型时会按行顺序匹配因子水平(
posmat第1行对应Pos的水平"1",以此类推),模型能正常拟合,但lmerTest的summary()函数在处理这个行名不匹配的对比矩阵时,内部逻辑出了问题——它错误地试图给多行结果设置同一个行名'Pos',这就触发了重复行名的错误。
快速修复方法:
在设置contrasts(database$Pos) = posmat之前,把posmat的行名改成database$Pos的水平名就行:
# 给posmat设置和Pos因子水平一致的行名 rownames(posmat) <- levels(database$Pos) # 再设置对比矩阵 contrasts(database$Pos) = posmat
之后再运行model = lmer(...)和summary(model),就能正常输出结果了。
额外补充:
你处理Clos因子的对比矩阵时没出问题,是因为closmat的列数是3(对应4个水平的因子需要3个对比项),lmerTest会自动将列名和因子名结合成唯一的行名(比如Clos_clos_c1),不会出现冲突。而Pos的对比矩阵只有1列,当行名不匹配时,lmerTest会错误地用因子名Pos作为行名,最终导致重复。
内容的提问来源于stack exchange,提问作者TakeMeToTheMoon
相关产品推荐
相关产品推荐

