R add1函数,范围参数引用所有变量

时间:2013-11-18 13:51:44

标签: r

当使用add1函数来考虑新变量时,我想引用所有变量(在某些数据帧或全局环境中),但我无法弄清楚如何使用scope参数来执行此操作。

我知道我可以像这样使用它

X = data.frame(replicate(4,rnorm(20))) ; y = rnorm(20)
lm1 = lm(y ~ 1)
out = add1(lm1, scope= ~X$X1 + X$X2 + X$X3)

但我想避免手动写入每个变量。

正如我在其他问题中所见,我知道。符号不起作用,但我不知道为什么。它代表已有的东西,所以如果我这样做

x1 = rnorm(20) ; x2 = rnorm(20) ; x3 = rnorm(20) ; x4 = rnorm(20) ; y = rnorm(20)
out = add1(lm1, scope= ~ . )

它不使用全球环境中已有的内容。

我知道文档说范围必须是“考虑条款的公式”,但这通常是在哪里。可以用来引用所有变量。

提前致谢。

另请注意我已阅读MASS的第7章,以及这些相关的主题

scope from add1()-command in R

http://tolstoy.newcastle.edu.au/R/help/02b/3588.html

3 个答案:

答案 0 :(得分:3)

这是一个更简单的答案,我在浏览这个问题后找到了

http://r.789695.n4.nabble.com/glm-formula-vs-character-td2543061.html

x1 = rnorm(100)
x2 = rnorm(100)
x3 = rnorm(100)
y = rnorm(100)


BaseReg = lm(y ~ 1)
newdf = data.frame(x1,x2,x3)

out = add1(BaseReg, names(newdf))

令人费解的是,在add1的文档中没有说明这种简单的方法。

答案 1 :(得分:0)

由于add1的帮助页面显示公式~.表示“已经存在的内容”。对于少量名称使用as.formula并不简单,但这种方法可以在函数或脚本中使用。 (通常人们会期望将X和Y放在同一个数据帧中。)

as.formula(paste("~", paste(names(YX)[-c(1,5)],collapse="+")))
#~X1 + X2 + X3

YX <- cbind(y,X)
form <- as.formula(paste("~", paste(names(YX)[-c(1,5)],collapse="+")))
add1(lm1, form)

您似乎偶然发现了一种更有效的策略。如果使用具有列名的数据对象:“y”“X1”“X2”“X3”

"X4:

> formula(YX)
y ~ X1 + X2 + X3 + X4
> formula(YX)[-2]
~X1 + X2 + X3 + X4
> as.list(formula(YX))
[[1]]
`~`

[[2]]
y

[[3]]
X1 + X2 + X3 + X4

> names(YX)
[1] "y"  "X1" "X2" "X3" "X4"

你可以看到一个公式对象的第一个元素是公式定义代字号,它实际上是一个R函数。第二个元素是LHS表达式,第三个元素是RHS表达式。

答案 2 :(得分:0)

我发现这是有效的:

X = data.frame(replicate(4,rnorm(20))) 
lm1 = lm(X1 ~ 1 ,data=X)
add1(lm1, scope=formula(X)[-2])

当然,我不知道为什么会这样呢

formula(X)[-2]
# ~X2 + X3 + X4

我偶然发现了它。其他的东西,如公式(X)[ - 1]和公式(X)[ - 3]也返回其他同样奇怪的东西。