FindInterval avec un vecteur qui change

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Boury frederic
Messages : 12
Enregistré le : 15 Jan 2018, 08:09

FindInterval avec un vecteur qui change

Messagepar Boury frederic » 09 Juin 2018, 20:11

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

;-)

Boury frederic
Messages : 12
Enregistré le : 15 Jan 2018, 08:09

Re: FindInterval avec un vecteur qui change

Messagepar Boury frederic » 09 Juin 2018, 20:30

Rebonjour :

Je suis un peu honteux...
En regardant bien, Monsieur Maxime Lopez avait apporté la réponse à une question similaire que j'avais posée en février :

a <- rowSums( F < x)

Frédéric Boury

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: FindInterval avec un vecteur qui change

Messagepar Logez Maxime » 11 Juin 2018, 09:06

Bonjour;

la honte c'est d'avoir mis un "p" à mon nom :-)

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité