2012-11-10 23 views
0

在列名稱中具有無效字符的數據框在rlm()中導致錯誤。在rlm()中導致錯誤的無效字符

從更深層面看,似乎RLM()內的變量xvars包含公式的解釋變量名,但是卻讓周圍的違規名反引號。然後,當xvars被用作索引的數據幀,namesly mf[xvars]它導致以下錯誤:

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

這是預期的行爲? (我意識到關鍵字短語無效個字符)。 奇怪的是,在相同的模型和數據框上調用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 
+0

我真的不明白你的問題 - 你在問爲什麼R函數有一個錯誤嗎? – hadley

+0

@hadley對不起,沒有清晰度。這個問題的標題是誤導,因爲我最初遇到這個正在運行的lm(),然後嘗試運行rlm()。這個問題實際上應該是爲什麼反引號被添加,但然後導致錯誤。我將清理一下 –

+0

明顯的答案是不要在列表名稱中使用也是公式運算符的字符。雖然我不能肯定地說,但我會懷疑這是令人困惑的問題。 –

回答

2

您的問題歸結爲您所使用的非syntatic變量名的事實。

這些應該謹慎使用,並且不要期望軟件包作者能夠預見可能出現的任何問題。

從幫助使用後會開出formula

Variable names can be quoted by backticks like this in formulae, although there is no guarantee that all code using formulae will accept such non-syntactic names.

的問題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那麼你可以使用

在這種情況下,您的data.frame中只需要三列(或評估環境中的對象)y,x1x2。因爲I()函數允許對變量執行算術運算,因爲I被解析爲符號terms.formula

+0

你是什麼意思關於'我()'導致名稱?您可以避免使用'colnames(mydf)< - make.names(c(「y」,「x1」,「x2」,「x1^2」,「x2^2」,「x1:x2」)強制合成名稱的問題「))' – mnel

相關問題