我试图在另一个函数中使用npreg()
包中的np
函数。我遇到与环境有关的错误。
npreg()
是用于非参数回归的函数。我分两步进行估算,首先使用npregbw()
估算带宽,然后可以在估算的带宽上调用npreg()
以获得回归估算。在函数调用之外,我没有遇到任何问题。然而,在函数调用npreg()
中,函数似乎无法使用估算的带宽。在下面重新表达:
x <- rnorm(20)
y <- 2*x + rnorm(20)
df <- data.frame(y, x)
pidtest <- function(outformula, data) {
# estimate conditional density of outcome
np_lower_bw <- np::npregbw(outformula, data = data)
np_lower <- np::npreg(np_lower_bw)
np_lower
}
pidtest(y~x, df)
#> Error in eval(predvars, data, env): invalid 'envir' argument of type 'closure'
如果我仅调用函数来估计带宽就没有问题
pidtest <- function(outformula, data) {
# estimate conditional density of outcome
np_lower_bw <- np::npregbw(outformula, data = data)
# np_lower <- np::npreg(np_lower_bw)
# np_lower
np_lower_bw
}
pidtest(y~x, df)
#>
#> Regression Data (20 observations, 1 variable(s)):
#>
#> x
#> Bandwidth(s): 0.3770171
#>
#> Regression Type: Local-Constant
#> Bandwidth Selection Method: Least Squares Cross-Validation
#> Formula: y ~ x
#> Bandwidth Type: Fixed
#> Objective Function Value: 1.469502 (achieved on multistart 1)
#>
#> Continuous Kernel Type: Second-Order Gaussian
#> No. Continuous Explanatory Vars.: 1
就像在函数调用之外一样,没有问题:
bws <- np::npregbw(y~x, df)
np::npreg(bws)
Regression Data: 20 training points, in 1 variable(s)
x
Bandwidth(s): 0.307494
Kernel Regression Estimator: Local-Constant
Bandwidth Type: Fixed
Continuous Kernel Type: Second-Order Gaussian
No. Continuous Explanatory Vars.: 1
我无法弄清楚为什么此错误会在函数调用内发生,也无法解决。我想将此估算值嵌入正在执行其他操作的函数中,因此急于想出一种使之起作用的方法。
答案 0 :(得分:2)
我无法确切解释原因,但是如果您尝试这段代码,它会起作用:
x <- rnorm(20)
y <- 2*x + rnorm(20)
df <- data.frame(y, x)
pidtest <- function(outformula, data) {
# estimate conditional density of outcome
np_lower_bw <- np::npregbw(as.formula(outformula), data = data)
np_lower <- np::npreg(np_lower_bw)
np_lower
}
pidtest("y~x", df)
有关此主题的更多信息,请参见此处:https://stat.ethz.ch/pipermail/r-help/2005-March/067109.html