Сегодня я столкнулся с проблемой: две почти идентичные функции работают как предполагалось до векторизации, но после нее одна работает нормально, а другая возвращает ошибку.
Я проверяю надежность различных оценокпо отношению к различным преобразованиям невязок и агрегирующих функций.Квантильная регрессия и наименьшее медианное квадратов являются частными случаями того, что я делаю.
Итак, я написал следующий код, чтобы посмотреть, как будет работать Наименьший тримэн квадратов, и обнаружил, что он работает нормально, если параметры моделипредоставляются в качестве различных аргументов, но завершается неудачно, если они входят в вектор.Например, мне нужна первая функция для построения графика (удобно использовать 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
, подавиться даже на одном входе?