2 votes

La vectorisation de deux fonctions similaires dans R fonctionne pour l'une d'entre elles

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 ?

0voto

Andreï Kostyrka Points 233

En tant que jogo a souligné, vpen2 lit les éléments du vecteur d'entrée et essaie de prendre le premier. La bonne façon de procéder est d'utiliser quelque chose comme

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

Cela renvoie un vecteur de valeurs de vpar2 évaluée à chaque ligne de la matrice.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X