使用 data.table 的步骤
Using step with data.table
我可以执行如下操作:
foo=data.frame(y=rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))
full=lm(foo$y ~ foo$x1 + foo$x2 + foo$x3)
nil=lm(foo$y ~ 1)
fwd=step(nil,scope=list(lower=formula(nil),upper=formula(full)),direction='forward')
但我正在使用 data.table 像这样:
library(data.table)
foo=data.table(y=rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))
full=foo[,lm(y ~ x1 + x2 + x3)]
nil=foo[,lm(y ~ 1)]
fwd=foo[,step(nil,scope=list(lower=formula(nil),upper=formula(full)),direction='forward')]
我收到错误:
Error in eval(expr, envir, enclos) : object 'x1' not found
但是 x1
是在上面的 J 表达式中为 data.table 定义的 - 有没有办法解决这个问题而不必将我的 table 转换为 data.frame?
您需要在 [.data.table
内将 .SD
作为 data
参数传递给 lm
,否则 data.table
会优化它的 j
仅使用引用内容的参数。
foo=data.table(y=rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))
full=foo[,lm(y ~ x1 + x2 + x3,data=.SD)]
nil=foo[,lm(y ~ 1,data=.SD)]
fwd <- step(nil,scope=list(lower=formula(nil),upper=formula(full)),direction='forward')
# using .SD means all columns are available
ls(environment(formula(nil))
## [1] "x1" "x2" "x3" "y"
# compared with
nil.noSD =foo[,lm(y ~ 1)]
ls(environment(formula(nil.noSD)))
## [1] "y"
请注意 data.table 和 lm
以及 update.formula 等的范围规则并不总是 "play nicely"
请参阅 Why is using update on a lm inside a grouped data.table losing its model data? 示例
我可以执行如下操作:
foo=data.frame(y=rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))
full=lm(foo$y ~ foo$x1 + foo$x2 + foo$x3)
nil=lm(foo$y ~ 1)
fwd=step(nil,scope=list(lower=formula(nil),upper=formula(full)),direction='forward')
但我正在使用 data.table 像这样:
library(data.table)
foo=data.table(y=rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))
full=foo[,lm(y ~ x1 + x2 + x3)]
nil=foo[,lm(y ~ 1)]
fwd=foo[,step(nil,scope=list(lower=formula(nil),upper=formula(full)),direction='forward')]
我收到错误:
Error in eval(expr, envir, enclos) : object 'x1' not found
但是 x1
是在上面的 J 表达式中为 data.table 定义的 - 有没有办法解决这个问题而不必将我的 table 转换为 data.frame?
您需要在 [.data.table
内将 .SD
作为 data
参数传递给 lm
,否则 data.table
会优化它的 j
仅使用引用内容的参数。
foo=data.table(y=rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100))
full=foo[,lm(y ~ x1 + x2 + x3,data=.SD)]
nil=foo[,lm(y ~ 1,data=.SD)]
fwd <- step(nil,scope=list(lower=formula(nil),upper=formula(full)),direction='forward')
# using .SD means all columns are available
ls(environment(formula(nil))
## [1] "x1" "x2" "x3" "y"
# compared with
nil.noSD =foo[,lm(y ~ 1)]
ls(environment(formula(nil.noSD)))
## [1] "y"
请注意 data.table 和 lm
以及 update.formula 等的范围规则并不总是 "play nicely"
请参阅 Why is using update on a lm inside a grouped data.table losing its model data? 示例