Les posteurs les plus actifs de la semaine
Aucun utilisateur |
Sujets les plus vus
Générer un nombre selon une densité
4 participants
Page 1 sur 1
Générer un nombre selon une densité
Bonjour
J'ai un petit soucis sur R. En effet, j'ai à ma disposition plusieurs observations (une centaine) et à partir de ça j'ai pu créer un histogramme puis j'ai estimé non paramétriquement la densité qui en découle (avec la commande density). L'objectif est de générer aléatoirement un nombre selon cette densité estimée. J'avais pensé à faire un tirage aléatoire dans ma liste d'observations brutes mais ce n'est pas la même chose que générer un nombre selon une densité de probabilité que j'ai estimée.
Bonne journée
Adrien
J'ai un petit soucis sur R. En effet, j'ai à ma disposition plusieurs observations (une centaine) et à partir de ça j'ai pu créer un histogramme puis j'ai estimé non paramétriquement la densité qui en découle (avec la commande density). L'objectif est de générer aléatoirement un nombre selon cette densité estimée. J'avais pensé à faire un tirage aléatoire dans ma liste d'observations brutes mais ce n'est pas la même chose que générer un nombre selon une densité de probabilité que j'ai estimée.
Bonne journée
Adrien
AdrienC- Nombre de messages : 93
Date d'inscription : 15/03/2018
Re: Générer un nombre selon une densité
Bonjour,
quelque chose comme ça :
quelque chose comme ça :
- Code:
# exemple :
y <- c(runif(10000), rnorm(10000))
d1 <- density(y)
# données générées
N <- 1000
yfit <- approx(cumsum(d1$y)/sum(d1$y), d1$x, runif(N))$y
# représentation graphique
library(ggplot2)
df <- data.frame(Y = c(y, yfit), fac = rep(c("y", "yfit"), c(length(y), length(yfit))))
ggplot(df, aes(Y, color = fac)) + geom_density()
droopy- Nombre de messages : 1156
Date d'inscription : 04/09/2009
Re: Générer un nombre selon une densité
merci beaucoup
AdrienC- Nombre de messages : 93
Date d'inscription : 15/03/2018
Re: Générer un nombre selon une densité
Plutôt que d'estimer une densité de proba, et de s'en servir pour tirer dedans, pourquoi ne pas tirer directement dans la distribution empirique observée ?
Il y a plusieurs méthodes pour faire ceci. La plus simple (et qui est celle que j'utilise tout le temps), est d'abord de calculer la fonction de répartition empirique. Il y a sous R la fonction ecdf() qui fait ceci. Ensuite, il faut travailler sur le graphe de cette fonction (avec en abscisse x, et en ordonnée la distribution empirique cumulée qui va de 0 à max(x)). L'idée dans ce cas est de tirer uniformément (runif()) une valeur de y (dans l'intervalle [0; max(x)]) et de prendre comme valeur tirée la coordonnée x correspondante, ou plus précisément, la plus petite valeur de x qui vérifie "F(x) supérieur ou égale à y" (ou F(x) est la fonction en question et y est la valeur tirée aléatoirement uniformément).
Ca tient en deux-trois lignes de code. Il y a des exemples ici: https://stephens999.github.io/fiveMinuteStats/inverse_transform_sampling.html (et dans plein d'autres sites web).
HTH, Eric.
Il y a plusieurs méthodes pour faire ceci. La plus simple (et qui est celle que j'utilise tout le temps), est d'abord de calculer la fonction de répartition empirique. Il y a sous R la fonction ecdf() qui fait ceci. Ensuite, il faut travailler sur le graphe de cette fonction (avec en abscisse x, et en ordonnée la distribution empirique cumulée qui va de 0 à max(x)). L'idée dans ce cas est de tirer uniformément (runif()) une valeur de y (dans l'intervalle [0; max(x)]) et de prendre comme valeur tirée la coordonnée x correspondante, ou plus précisément, la plus petite valeur de x qui vérifie "F(x) supérieur ou égale à y" (ou F(x) est la fonction en question et y est la valeur tirée aléatoirement uniformément).
Ca tient en deux-trois lignes de code. Il y a des exemples ici: https://stephens999.github.io/fiveMinuteStats/inverse_transform_sampling.html (et dans plein d'autres sites web).
HTH, Eric.
Eric Wajnberg- Nombre de messages : 1238
Date d'inscription : 14/09/2012
Re: Générer un nombre selon une densité
Bonjour, je trouve le sujet intéressant.
Par curiosité, dans quel cadre as-tu eu besoin de générer ce nombre aléatoire en fonction de la densité de ta population ?
(à quoi ça sert derrière en gros)
Par curiosité, dans quel cadre as-tu eu besoin de générer ce nombre aléatoire en fonction de la densité de ta population ?
(à quoi ça sert derrière en gros)
zezima- Nombre de messages : 939
Date d'inscription : 26/02/2013
Re: Générer un nombre selon une densité
Bonjour, mon directeur de thèse m'a demandé de faire un algorithme où je dois créer un échantillon synthétique de ma base de données qui me sert de base d'entraînement. Je ne dois pas piocher directement dans les valeurs "brutes" mais bien en tirer une aléatoirement selon la densité estimée.
Ca vient du cadre des forêts aléatoires dans le cadre non supervisés (qui permet d'obtenir une matrice de similarité entre les individus) ==> deux individus sont "proches" s'ils tombent souvent dans la même feuille dans chaque arbre de la forêt. Pour créer la forêt, on suppose que les individus de la base sont de classe A et on crée un échantillon synthétique de classe B.
C'est pour ça que j'avais besoin de générer des individus synthétiques. Ce ne sont pas forcément des individus qui existent dans la base.
Je vous remercie Eric pour votre dernier message, c'est exactement de ça dont j'avais besoin !
Ca vient du cadre des forêts aléatoires dans le cadre non supervisés (qui permet d'obtenir une matrice de similarité entre les individus) ==> deux individus sont "proches" s'ils tombent souvent dans la même feuille dans chaque arbre de la forêt. Pour créer la forêt, on suppose que les individus de la base sont de classe A et on crée un échantillon synthétique de classe B.
C'est pour ça que j'avais besoin de générer des individus synthétiques. Ce ne sont pas forcément des individus qui existent dans la base.
Je vous remercie Eric pour votre dernier message, c'est exactement de ça dont j'avais besoin !
AdrienC- Nombre de messages : 93
Date d'inscription : 15/03/2018
Re: Générer un nombre selon une densité
D'accord, merci pour ces explications.
Donc c'est une manière de simuler un jeu de données "test" en plus du jeu de données "entrainement" qui existe déjà.
Par contre si je comprends bien, la simulation ne se fait que sur une variable à la fois, c'est bien ça ?
Donc c'est une manière de simuler un jeu de données "test" en plus du jeu de données "entrainement" qui existe déjà.
Par contre si je comprends bien, la simulation ne se fait que sur une variable à la fois, c'est bien ça ?
zezima- Nombre de messages : 939
Date d'inscription : 26/02/2013
Re: Générer un nombre selon une densité
Une référence incontournable ici est le bouquin de Rubinstein :
https://www.wiley.com/en-us/Simulation+and+the+Monte+Carlo+Method%2C+3rd+Edition-p-9781118632161
Un vrai bijou !
Eric.
https://www.wiley.com/en-us/Simulation+and+the+Monte+Carlo+Method%2C+3rd+Edition-p-9781118632161
Un vrai bijou !
Eric.
Eric Wajnberg- Nombre de messages : 1238
Date d'inscription : 14/09/2012
Re: Générer un nombre selon une densité
Je vous remercie pour les méthodes de Monte Carlo. C'est ça que je cherche à bien comprendre. C'est un outil vraiment incontournable de la statistique.
Oui la simulation se fait qu'une variable par variable. L'idéal serait de le faire de façon multivariée pour que ce soit plus réaliste
Oui la simulation se fait qu'une variable par variable. L'idéal serait de le faire de façon multivariée pour que ce soit plus réaliste
AdrienC- Nombre de messages : 93
Date d'inscription : 15/03/2018
Re: Générer un nombre selon une densité
Mais on peut faire des tirages en multivarié. Sinon, on néglige les corrélations entre les variables et le schéma de simulation devient faux. Le principe est le même, mais avec un calcul matriciel au milieu (et une décomposition de Cholesky de la matrice de variance-covariance). Ici aussi, il existe pas mal de ressources sur le web.AdrienC a écrit:L'idéal serait de le faire de façon multivariée pour que ce soit plus réaliste
HTH, Eric.
Eric Wajnberg- Nombre de messages : 1238
Date d'inscription : 14/09/2012
Re: Générer un nombre selon une densité
Rebonjour, est-ce que la procédure que vous utilisez pour simuler des données à partir d'une méthode de Monte-Carlo basée sur la matrice de variance covariance (avec une décomposition de Choleski) a un nom en particulier ?
Car j'ai vu sur certains articles qu'ils partent souvent du fait que la distribution de mes variables est normale ce qui n'est pas du tout mon cas.
Je vous remercie
Bonne journée
Adrien
Car j'ai vu sur certains articles qu'ils partent souvent du fait que la distribution de mes variables est normale ce qui n'est pas du tout mon cas.
Je vous remercie
Bonne journée
Adrien
AdrienC- Nombre de messages : 93
Date d'inscription : 15/03/2018
Re: Générer un nombre selon une densité
J'ai trouvé, je vous remercie
AdrienC- Nombre de messages : 93
Date d'inscription : 15/03/2018
Re: Générer un nombre selon une densité
Re-bonjour,
Est-ce que c'est possible que tu partages la procédure ?
Est-ce que c'est possible que tu partages la procédure ?
zezima- Nombre de messages : 939
Date d'inscription : 26/02/2013
Re: Générer un nombre selon une densité
Oui bien sur
Soit X le tableau de données de dimension (n,p). On commence par calculer la matrice de variance-covariance empirique S.
Ensuite, on calcule la décomposition de Choleski où S = t(B)*B avec B est une matrice triangulaire inférieure.
On simule 1000 observations Y selon une loi normale N(0, I_p) avec I_p qui est la matrice identité de dimension (p,p) et avec l'espérance = (0,....,0) ==> p fois.
Le tableau simulé Y* = A + Y*B avec A qui est une matrice (1000,p) simulée selon une loi normale N(0,I_p).
Cette matrice A sert pour rajouter le terme d'erreur
http://www.unit.eu/cours/cyberrisques/etage_3_frederic/co/Module_Etage_3_28.html
Pour la référence
Soit X le tableau de données de dimension (n,p). On commence par calculer la matrice de variance-covariance empirique S.
Ensuite, on calcule la décomposition de Choleski où S = t(B)*B avec B est une matrice triangulaire inférieure.
On simule 1000 observations Y selon une loi normale N(0, I_p) avec I_p qui est la matrice identité de dimension (p,p) et avec l'espérance = (0,....,0) ==> p fois.
Le tableau simulé Y* = A + Y*B avec A qui est une matrice (1000,p) simulée selon une loi normale N(0,I_p).
Cette matrice A sert pour rajouter le terme d'erreur
http://www.unit.eu/cours/cyberrisques/etage_3_frederic/co/Module_Etage_3_28.html
Pour la référence
AdrienC- Nombre de messages : 93
Date d'inscription : 15/03/2018
Re: Générer un nombre selon une densité
Merci c'est très clair
zezima- Nombre de messages : 939
Date d'inscription : 26/02/2013
Sujets similaires
» dérivé d'une densité
» Densité de la loi du Fmax d'Hartley
» Générer Prénom, et Nom
» Supprimer des lignes selon colonne.
» Tracer des courbes de densite sur un histogramme avec ggplot
» Densité de la loi du Fmax d'Hartley
» Générer Prénom, et Nom
» Supprimer des lignes selon colonne.
» Tracer des courbes de densite sur un histogramme avec ggplot
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum