【问题标题】:R -> Error in `row.names<-.data.frame`R -> `row.names<-.data.frame` 中的错误
【发布时间】:2018-11-11 21:54:07
【问题描述】:

在这个其他问题 (Get p-value about contrast hypothesis for rectangular matrix) 之后,我试图在 R 中运行以下代码,但行:

colnames(posmat) <- "pos_c1"

调用函数summary()时出错。

Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
  duplicate 'row.names' are not allowed
In addition: Warning message:
non-unique value when setting 'row.names': ‘Pos’ 

有人知道为什么会出现这个错误吗? 这里是 MWE:

library(lme4)
library(lmerTest)
library(corpcor)

database <- data.frame(
Clos=factor(c(4,4,1,4,4,3,2,1,2,1,2,2,4,3,1,2,1,4,1,3,2,2,4,4,4,4,2,1,4,2,2,1,4,2,4,2,1,4,4,3)),
Pos=factor(c(2,4,1,2,5,6,7,2,2,2,5,6,3,3,3,8,5,3,4,2,1,4,3,3,2,6,1,8,3,7,5,7,8,3,6,6,1,6,3,7)),
RF=c(8,6,2,9,7,1,7,6,3,4,6,4,5,2,5,5,3,4,1,3,1,2,3,1,2,2,3,1,8,5,2,2,7,1,9,4,5,6,4,2),
Score=c(4,3,3,5,4,3,2,4,5,2,2,3,3,4,4,4,3,2,3,3,5,4,3,4,4,2,3,4,3,4,1,2,2,2,3,4,5,3,1,2)
)
clos_c1 = c(0,0,-1,1)
clos_c2 = c(0,-1,0,1)
clos_c3 = c(-1,0,0,1)
closmat.temp = rbind(constant = 1/4,clos_c1,clos_c2,clos_c3)
closmat = solve(closmat.temp)
closmat = closmat[, -1]
closmat
pos_c1 = c(1/2,1/2,-1/6,-1/6,-1/6,-1/6,-1/6,-1/6)
posmat.temp = rbind(pos_c1)
posmat = pseudoinverse(posmat.temp)
colnames(posmat) <- "pos_c1"
contrasts(database$Clos) = closmat
contrasts(database$Pos) = posmat
model = lmer(Score~Clos+Pos+(1|RF), data = database, REML = TRUE)
summary(model)

【问题讨论】:

  • 如果你把这个 lmer 改成 lme4::lmer 就可以了。但我不确定你想要哪个 lmer 函数。

标签: r


【解决方案1】:

问题在于,当您运行模型时,contrasts(database$Pos) 没有列名,而只有一个。 您可以通过运行 model 变量来看到这一点,您将看到 6 个名为“Pos”的变量。这会导致读取summary() 命令时出现问题。只需添加行

colnames(contrasts(database$Pos))<-c("pos1","pos2","pos3","pos4","pos5","pos6","pos7")

创建您的contrasts(database$Pos) &lt;- posmat 之后 您的代码将起作用。随意输入您需要的名称。

那么整个代码如下:

library(lme4)
library(lmerTest)
library(corpcor)

database <- data.frame(
  Clos=factor(c(4,4,1,4,4,3,2,1,2,1,2,2,4,3,1,2,1,4,1,3,2,2,4,4,4,4,2,1,4,2,2,1,4,2,4,2,1,4,4,3)),
  Pos=factor(c(2,4,1,2,5,6,7,2,2,2,5,6,3,3,3,8,5,3,4,2,1,4,3,3,2,6,1,8,3,7,5,7,8,3,6,6,1,6,3,7)),
  RF=c(8,6,2,9,7,1,7,6,3,4,6,4,5,2,5,5,3,4,1,3,1,2,3,1,2,2,3,1,8,5,2,2,7,1,9,4,5,6,4,2),
  Score=c(4,3,3,5,4,3,2,4,5,2,2,3,3,4,4,4,3,2,3,3,5,4,3,4,4,2,3,4,3,4,1,2,2,2,3,4,5,3,1,2)
)
clos_c1 = c(0,0,-1,1)
clos_c2 = c(0,-1,0,1)
clos_c3 = c(-1,0,0,1)
closmat.temp = rbind(constant = 1/4,clos_c1,clos_c2,clos_c3)
closmat = solve(closmat.temp)
closmat = closmat[, -1]
closmat
pos_c1 = c(1/2,1/2,-1/6,-1/6,-1/6,-1/6,-1/6,-1/6)
posmat.temp = rbind(pos_c1)
posmat <- pseudoinverse(posmat.temp)
colnames(posmat) <- "pos_c1"
contrasts(database$Clos) <- closmat
contrasts(database$Pos) <- posmat
##NEW LINE
colnames(contrasts(database$Pos))<-c("pos1","pos2","pos3","pos4","pos5","pos6","pos7")
model <- lmer(Score~Clos+Pos+(1|RF), data = database, REML = TRUE)
summary(model)

我希望它有所帮助。干杯!

【讨论】:

  • 这有点帮助。谢谢!我的意思是,我猜现在“pos1”是我的“pos_c1”,对吗?据我了解,在创建矩形 posmat 后, contrasts() 函数将其转换为等效的平方矩阵,其中第一列是我的对比度,因此“pos1”成为我的对比度的新列名。我错了吗?
  • 据我了解,您是对的。我写了“pos1”,引用了你的“pos_c1”。当使用因子(即分类变量)作为解释变量拟合线性模型时,需要 contrasts() 函数。它指定如何将因子的水平编码为一系列数字虚拟变量以拟合模型。完整的解释可以在这里找到:stackoverflow.com/a/2354304/9513536,干杯!
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 2022-07-20
  • 2020-12-10
  • 1970-01-01
相关资源
最近更新 更多