Aujourd'hui, j'ai rencontré un problème : deux fonctions presque identiques fonctionnent comme prévu avant la vectorisation, mais après celle-ci, l'une fonctionne correctement et l'autre renvoie une erreur.
J'examine la robustesse de divers estimateurs par rapport à différentes transformations des résidus et des fonctions d'agrégation. La régression quantile et la moindre médiane des carrés sont des cas particuliers de ce que je fais.
J'ai donc écrit le code suivant pour voir comment la méthode des moindres carrés allait fonctionner et j'ai découvert qu'elle fonctionnait correctement si les paramètres du modèle étaient fournis en tant qu'arguments différents, mais qu'elle échouait s'ils étaient présentés sous la forme d'un vecteur. Par exemple, j'ai besoin de la première fonction pour le tracé (il est pratique d'utiliser outer(...)
pour obtenir une matrice de valeurs pour persp
ou simplement fournir f(x, y)
à persp3d
de library(rgl)
Les optimiseurs R attendent un vecteur d'entrées comme premier argument sur lequel la minimisation va être effectuée).
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
Pourquoi les vpen2
étant vectorisé pen2
L'utilisation d'une seule entrée, d'un étranglement ou d'un starter est-elle possible ?