将公式作为带引号的字符串传递给 leaps 包中的 regsubsets() 函数

Passing formula as a quoted string to regsubsets() function from the leaps package

我试图缩短将公式传递给 regsubsets() 函数的过程,而不必编写完整的字符串。因此,我使用以下代码生成公式字符串,但 regsubsets 函数给出了错误“argument “y” is missing”。

当我粘贴生成的不带引号的公式字符串时,它被接受了。但是当我在引号内粘贴公式字符串时,会生成相同的错误。所以,在我看来,引号是问题所在。

如何绕过这个错误?
有没有另一个函数可以将不带引号的字符串参数传递给这种挑剔的函数?

这是代码示例:

# load data
data(mtcars)  # pre-loaded in R
head(mtcars,2)
#               mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
## full model formula
# response & predictors
yvar = c('mpg')
xvars = setdiff(colnames(mtcars), yvar)
xvars
# 'cyl''disp''hp''drat''wt''qsec''vs''am''gear''carb'
# formula string
fstr = paste(yvar, '~', paste(setdiff(names(mtcars), yvar), collapse='+'))
fstr
# 'mpg ~ cyl+disp+hp+drat+wt+qsec+vs+am+gear+carb'
## regsubsets regression
library(leaps)
subset = regsubsets(fstr, data=mtcars, method='exhaustive', nbest=2)
res = summary(subset)
res

# Error in leaps.setup(x, y, wt = weights, nbest = nbest, nvmax = nvmax, : argument "y" is 
# missing, with no default
# Traceback:

# 1. regsubsets(fstr, data = mtcars, method = "exhaustive", nbest = 2)
# 2. regsubsets.default(fstr, data = mtcars, method = "exhaustive", nbest = 2)
# 3. leaps.setup(x, y, wt = weights, nbest = nbest, nvmax = nvmax, 
#  .     force.in = force.in, force.out = force.out, intercept = intercept)

关于报价,您的方向是正确的。这些表明您正在将字符串 (fstr) 而不是公式传递给 regsubsets。但是字符串不是公式,即使是字符串也是公式。将公式的字符串转换为实际公式就像 as.formula(fstr).

一样简单

所以微小的修改产生了这个结果:

library(leaps)

data(mtcars)

yvar  <- 'mpg'
xvars <-  setdiff(colnames(mtcars), yvar)

fstr <- paste(yvar, '~', paste(setdiff(names(mtcars), yvar), collapse = '+'))
fstr <- as.formula(fstr)

subset = regsubsets(fstr, data = mtcars, method = 'exhaustive', nbest = 2)
res = summary(subset)
res
#> Subset selection object
#> Call: regsubsets.formula(fstr, data = mtcars, method = "exhaustive", 
#>     nbest = 2)
#> 10 Variables  (and intercept)
#>      Forced in Forced out
#> cyl      FALSE      FALSE
#> disp     FALSE      FALSE
#> hp       FALSE      FALSE
#> drat     FALSE      FALSE
#> wt       FALSE      FALSE
#> qsec     FALSE      FALSE
#> vs       FALSE      FALSE
#> am       FALSE      FALSE
#> gear     FALSE      FALSE
#> carb     FALSE      FALSE
#> 2 subsets of each size up to 8
#> Selection Algorithm: exhaustive
#>          cyl disp hp  drat wt  qsec vs  am  gear carb
#> 1  ( 1 ) " " " "  " " " "  "*" " "  " " " " " "  " " 
#> 1  ( 2 ) "*" " "  " " " "  " " " "  " " " " " "  " " 
#> 2  ( 1 ) "*" " "  " " " "  "*" " "  " " " " " "  " " 
#> 2  ( 2 ) " " " "  "*" " "  "*" " "  " " " " " "  " " 
#> 3  ( 1 ) " " " "  " " " "  "*" "*"  " " "*" " "  " " 
#> 3  ( 2 ) "*" " "  "*" " "  "*" " "  " " " " " "  " " 
#> 4  ( 1 ) " " " "  "*" " "  "*" "*"  " " "*" " "  " " 
#> 4  ( 2 ) " " " "  " " " "  "*" "*"  " " "*" " "  "*" 
#> 5  ( 1 ) " " "*"  "*" " "  "*" "*"  " " "*" " "  " " 
#> 5  ( 2 ) " " " "  " " "*"  "*" "*"  " " "*" " "  "*" 
#> 6  ( 1 ) " " "*"  "*" "*"  "*" "*"  " " "*" " "  " " 
#> 6  ( 2 ) " " "*"  "*" " "  "*" "*"  " " "*" "*"  " " 
#> 7  ( 1 ) " " "*"  "*" "*"  "*" "*"  " " "*" "*"  " " 
#> 7  ( 2 ) "*" "*"  "*" "*"  "*" "*"  " " "*" " "  " " 
#> 8  ( 1 ) " " "*"  "*" "*"  "*" "*"  " " "*" "*"  "*" 
#> 8  ( 2 ) " " "*"  "*" "*"  "*" "*"  "*" "*" "*"  " "

reprex package (v0.3.0)

于 2020-12-18 创建