Lognormales nombres aléatoires dans la gamme spécifique dans Matlab
-
28-09-2019 - |
Question
Je veux développer une distribution log-normale avec la gamme [0.42,1.19], dont quelques éléments sont donnés à titre D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42]
. La moyenne devrait être 0.84
et l'écart type aussi faible que possible. Aussi donnée est que les 90% de CDI (= 90% des grains) est comprise entre 0.59 and 1.19
.
Une fois que je connais tous les éléments de cette distribution lognormale qui incorporent les conditions données que je peux trouver le pdf, ce qui est ce que je demande. Voici les étapes simples que j'essayées:
D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42];
s=0.30; % std dev of the lognormal distribution
m=0.84; % mean of the lognormal distribution
mu=log(m^2/sqrt(s^2+m^2)); % mean of the associated normal dist.
sigma=sqrt(log((s^2/m^2)+1)); % std dev of the associated normal dist.
[r,c]=size(D);
for i=1:c
D_normal(i)=mu+(sigma.*randn(1));
w(i)=(D_normal(i)-mu)/sigma; % the probability or the wt. percentage
end
sizes=exp(D_normal);
La solution
Si vous avez la boîte à outils de statistiques et que vous voulez dessiner des valeurs aléatoires de la distribution log-normale, vous pouvez simplement appeler LOGNRND . Si vous voulez connaître la densité de la distribution log-normale avec une moyenne et sigma donnée à une valeur spécifique, vous utilisez LOGNPDF .
Puisque vous calcul des poids, vous pouvez rechercher la densité. Ceux-ci seraient, dans votre exemple:
weights = lognpdf([1.19,1.00,0.84,0.71,0.59,0.50,0.42],0.84,0.3)
weights =
0.095039 0.026385 0.005212 0.00079218 6.9197e-05 5.6697e-06 2.9244e-07
EDIT
Si vous voulez savoir quel est le pourcentage de grains tombe dans la gamme de 0,59 à 1,19, vous utilisez LOGNCDF :
100*diff(logncdf([0.59,1.19],0.84,0.3))
ans =
1.3202
Ce n'est pas beaucoup. Si vous tracer la distribution, vous remarquerez que la distribution lognormale avec vos valeurs pics un peu au-dessus 2
x = 0:0.01:10;
figure
plot(x,lognpdf(x,0.84,0.3))
Autres conseils
Il semble que vous cherchez à générer des nombres aléatoires tronquée lognormales. Si mon hypothèse est correcte, vous pouvez utiliser le échantillonnage de rejet ou transformée inverse échantillonnage pour générer les échantillons nécessaires. Avertissement:. Échantillonnage Le rejet est très inefficace si vos limites sont très loin de la moyenne
Rejet d'échantillonnage
Si x ~ lognormales (mu, sigma) I (lb Ensuite, générer, x ~ lognormales (mu, sigma) et accepter le tirage au sort si lb Transformation inverse échantillonnage Si x ~ lognormales (mu, sigma) I (lb CDF (x) = phi ((log (x) - mu) / sigma) / (phi ((log (ub) - mu) / sigma) - phi ((log (lb) - mu) / sigma) ) Générer, u ~ uniforme (0,1). Set, CDF (x) = u et inverti pour x. En d'autres termes, x = exp (mu + sigma * phi_inverse (u * (phi ((log (ub) - mu) / sigma) - phi ((log (lb) - mu) / sigma))))