【问题标题】:Invalid Characters causing error in rlm()导致 rlm() 错误的无效字符
【发布时间】:2012-11-10 23:54:26
【问题描述】:

列名中包含无效字符的数据框导致 rlm() 出错。

更深入地研究一下,在 rlm() 中,变量 xvars 似乎包含公式的解释变量的名称,但它会在有问题的名称周围加上反引号。然后当 xvars 用作数据框的索引时,即mf[xvars] 会导致以下错误:

Error in `[.data.frame`(mf, xvars) : undefined columns selected

这是预期的行为吗? (我意识到关键字词组 invalid 个字符)。 奇怪的是,在同一模型和数据帧上调用 lm() 不会导致任何问题。

# SAMPLE DATA
mydf <- data.frame(matrix(rnorm(36),ncol=6))
colnames(mydf) <- c("y", "x1", "x2", "x1^2", "x2^2", "x1:x2")

rlm(y~., data=mydf)  # Error

lm(y~., data=mydf)   # No Problem

# Clean up column names
colnames(mydf) <- make.names(colnames(mydf))
rlm(y~., data=mydf) # No Problem 

查看MASS:::rlm.formula,似乎错误是
由mf[xvars] 在以下几行中引起:

xlev <- if (length(xvars) > 0L) {
    xlev <- lapply(mf[xvars], levels)
    xlev[!sapply(xlev, is.null)]
}

任何想法为什么要添加反引号但随后导致错误?


附加信息

我复制了 rlm() 函数,添加了 dput(mf) 和 dput(xvars) 并得到以下值。 请注意,xvars 的值与上面指定的名称不同(即添加了反引号)。此外,mf 的名称与上面给出的名称相同。

# dput yielded
mf <- structure(list(y = c(-0.242914027018629, 0.724255425682537, -0.0578467214604185, -0.274193999595702, -0.38985000750839, 0.406046200943395), x1 = c(1.53071709960635, -1.87493297716611, 1.0936519723035, -0.977011182431237, -0.510890461021046, 1.20136627562427), x2 = c(-0.801995963036553, 1.30590232081605, 0.635922235436178, -1.86824341731708, -2.76797814532917, -0.497992681627495), `x1^2` = c(0.914146279518207, 0.103458073891876, -1.29818230391818, -0.629048606358592, 1.71534374557621, 0.922690967521984), `x2^2` = c(-0.0879726513660469, 1.05299413769867, 1.01955640371072, 0.546413685721721, 0.947757793667223, -0.0998700630220064), `x1:x2` = c(-0.757490494166813, 1.31307393014016, 1.90233916482184, 0.68844011701049, -1.28717997826724, -0.581800325341162)), .Names = c("y", "x1", "x2", "x1^2", "x2^2", "x1:x2"), terms = y ~     x1 + x2 + `x1^2` + `x2^2` + `x1:x2`, row.names = c(NA, 6L), class = "data.frame")
xvars <- c("x1", "x2", "`x1^2`", "`x2^2`", "`x1:x2`")

mf[xvars]  
# Error in `[.data.frame`(mf, xvars) : undefined columns selected


# Removing the backticks from xvars eliminates the error.
xvars <- sapply(xvars, function(x) gsub("`", "", x))
mf[xvars2]  # No Error

【问题讨论】:

  • 我不太明白你的问题——你在问为什么 R 函数有错误?
  • @hadley 抱歉,不清楚。问题的标题具有误导性,因为我最初遇到这个正在运行的 lm(),然后尝试运行 rlm()。问题应该是为什么要添加反引号,但随后会导致错误。我会清理一下
  • 显而易见的答案是不要在列表名称中使用也是公式运算符的字符。虽然我不能肯定地说,但我怀疑这就是令人困惑的 rlm。
  • @MatthewLundberg。你当然是对的,这就是我最终做的。但是,我仍然很好奇为什么会发生这种情况。

标签: r invalid-characters


【解决方案1】:

您的问题归结为您使用的是非语法变量名称。

这些应该谨慎使用,不要期望包作者能够预测可能出现的任何问题。

引用formula的帮助

变量名可以用反引号like this在公式中引用, 虽然不能保证所有使用公式的代码都会 接受这样的非语法名称。

xvars是如何创建的问题rlm.formula

xvars <- as.character(attr(mt, "variables"))[-1L]

以后再用

xlev <- if (length(xvars) > 0L) {
        xlev <- lapply(mf[xvars], levels)
        xlev[!sapply(xlev, is.null)]
    }

正如你所展示的那样,它不起作用

这将为非语法名称创建带引号的反引号变量。如果他们已经被反引号,那么他们将创建双反引号

即如果列名是"x1^2",则xvar 中的元素变为"`x1^2`"。

例如 [.data.frame 失败

x <- data.frame(`a` = 1)
> x[,'`a`']

Error in `[.data.frame`(x, , "`a`") : undefined columns selected

因为列名是'a' 而不是`a`

如果你反引号列名

即如果列名是"`x1^2`",则xvar 中的元素变为"``x1^2``"。

这又不是你的 data.frame 中的一列

lm 起作用的原因是它没有尝试这种定义和使用xvars,而是使用model.matrix 来定义设计矩阵x 直接传递给lm.fit

如果你想拟合模型y ~ x1 + x2 + x1:x2 +x1^2 + y1^2,那么你可以使用

rlm(y ~ x1*x2 + I(x1^2) + I(x2^2)

在这种情况下,您的 data.frame(或评估环境中的对象)中只需要三列 y、x1 和 x2。因为I() 函数允许对变量执行算术运算,因为I 被terms.formula 解析为符号

【讨论】:

  • I() 导致名称是什么意思?您可以避免使用 colnames(mydf) &lt;- make.names(c("y", "x1", "x2", "x1^2", "x2^2", "x1:x2")) 强制使用语法名称的问题
猜你喜欢
  • 2019-05-13
  • 2021-12-22
  • 2016-12-16
  • 1970-01-01
  • 2015-01-13
  • 2015-03-19
  • 2018-06-20
  • 1970-01-01
相关资源
最近更新 更多