当使用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章,以及这些相关的主题
答案 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]也返回其他同样奇怪的东西。