Векторизация двух похожих функций в R работает для одного - PullRequest
0 голосов
/ 30 мая 2018

Сегодня я столкнулся с проблемой: две почти идентичные функции работают как предполагалось до векторизации, но после нее одна работает нормально, а другая возвращает ошибку.

Я проверяю надежность различных оценокпо отношению к различным преобразованиям невязок и агрегирующих функций.Квантильная регрессия и наименьшее медианное квадратов являются частными случаями того, что я делаю.

Итак, я написал следующий код, чтобы посмотреть, как будет работать Наименьший тримэн квадратов, и обнаружил, что он работает нормально, если параметры моделипредоставляются в качестве различных аргументов, но завершается неудачно, если они входят в вектор.Например, мне нужна первая функция для построения графика (удобно использовать outer(...), чтобы получить матрицу значений для persp, или просто поставить f(x, y) в persp3d из library(rgl), но вторую для оценки (R-оптимизаторы ожидают вектор входных данных в качестве первого аргумента, по которому будет выполняться минимизация).

MWE:

set.seed(105)
N <-  204
x <- rlnorm(N)
y <- 1 + x + rnorm(N)*sqrt(.1+.2*x+.3*x^2)
# A simple linear model with heteroskedastic errors

resfun <- function(x) return(x^2)
# Going to minimise a function of squared residuals...
distfun <- function(x) return(mean(quantile(x, c(0.25, 0.5, 0.5, 0.75)))) 
# ...which in this case is the trimean

penalty <- function(theta0, theta1) {
  r <- y - theta0 - theta1*x
  return(distfun(resfun(r)))
}

pen2 <- function(theta) {
  r <- y - theta[1] - theta[2]*x
  return(distfun(resfun(r)))
}

penalty(1, 1) # 0.5352602
pen2(c(1, 1)) # 0.5352602

vpenalty <- Vectorize(penalty)
vpen2 <- Vectorize(pen2)

vpenalty(1, 1) # 0.5352602
vpen2(c(1, 1))

Error in quantile.default(x, c(0.25, 0.5, 0.5, 0.75)) : 
missing values and NaN's not allowed if 'na.rm' is FALSE 

Почему vpen2, векторизация pen2, подавиться даже на одном входе?

1 Ответ

0 голосов
/ 30 мая 2018

Как указывало jogo , vpen2 читает элементы входного вектора и пытается взять первый.Правильный путь - использовать что-то вроде

a <- matrix(..., ncol=2)
apply(a, 1, pen2)

. Это вернет вектор значений из vpar2, вычисленных в каждой строке матрицы.

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