сложность вызова функции из пакета np внутри функции, возможная проблема среды - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь использовать функцию 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 голосов
/ 20 февраля 2019

Я не могу точно объяснить, почему, но если вы попробуете этот кусок кода, он сработает:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...