无法从函数内的np包调用函数,可能是环境问题

时间:2019-02-20 15:57:30

标签: r

我试图在另一个函数中使用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

我无法弄清楚为什么此错误会在函数调用内发生,也无法解决。我想将此估算值嵌入正在执行其他操作的函数中,因此急于想出一种使之起作用的方法。

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