Bonjour :
Mon problème serait d'appliquer la fonction findInterval(X, V) sur un ensemble de valeurs (placées dans le vecteur X) mais avec un vecteur V qui change pour chaque valeur de X alors que dans findInterval le vecteur V est constant.
Par exemple, si X = runif(1E6) - soit 1 million de tirages uniformes compris entre 0 et 1 - et F une distribution cumulée comprise entre 0 et 1 avec n quantiles, en faisant a <- findInterval(X, F) on obtient un vecteur a(1E6) qui donnera le positionnement en quantile de chaque valeur de X : la fonction findInterval est très performante pour cela : elle est donc parfaite pour générer la fonction F-1(u) qui est la base des Monte-Carlo avec des distributions F arbitraires...
Par contre, si la distribution F est fonction de chaque valeur de X ( F est alors une matrice de dimension (1E6, n) ) je ne peux pas utiliser la fonction findInterval ... Or, c'est lce que je cherche à faire (et je pense une situation courante dans les simulations Monte-Carlo).
J'ai créé une fonction rnk_UV <- function (x, F) {max( which( F < x))} où F est la distribution cumulée et qui me retourne la valeur du quantile correspondant à x en entrée.
Si je veux l'appliquer par mapply et faire a <- mapply(rnk_UV, X, F)ça ne marche pas de façon directe... il faut transformer la matrice F en une série de listes pour passer chaque ligne de F comme argument variable de mapply ... soit Fliste <-,as.list(data.frame(t(F))) et faire mapply(rnk_UV, s, Fliste) avec des performances très mauvaises.
J'ai adopté une autre solution qui donne de meilleurs résultats ... et qui passe par une boucle for (ce qu'on cherche pourtant à éviter)
rnk_UV2 <- function (U, V) { a<-rep(0,n)
for(i in 1:n) {a[i]<-max(which(V[i,]<U[i]))}
return(a) }
Cela dit, on est très loin des performances obtenues avec findInterval !
A mon avis, il y a des pistes...
- soit utiliser mapply mais alors il faut trouver une solution qui permet de passer directement la matrice F sans la transformer en liste ce qui consomme beaucoup de temps et d'espace,
- soit encore en cherchant , j'ai vu qu'on pouvait envisager d'utiliser la fonction outer (X matrice, Y matrice , FUN fonction ) ...
En tous cas, je ne suis pas assez compétent en programmation R pour m'en sortir.
Merci de votre aide
Frédéric Boury
;-)