2010-06-18 6 views
0

Je souhaite développer une distribution lognormale avec la plage [0.42.1.19], dont les quelques éléments sont donnés comme 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 petit que possible. Également donné est que le 90% de cdf (= 90% des grains) se situe entre 0.59 and 1.19. Une fois que je connais tous les éléments de cette distribution log-normale qui intègrent les conditions données, je peux trouver son pdf, ce dont j'ai besoin. Voici les étapes simples que j'ai essayées:Numéros aléatoires lognormaux dans la plage spécifique dans Matlab

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); 
+0

Je suggère d'ajouter le code que vous avez à ce jour à votre question. Cela nous aidera à mieux vous aider. – gnovice

+0

Veuillez formater votre code affiché - vous pouvez le faire en surlignant et en cliquant sur le bouton 'uns-et-zéros'. – Doresoom

Répondre

1

Si vous avez la boîte à outils statistiques et que vous voulez dessiner des valeurs aléatoires à partir de la distribution lognormale, vous pouvez simplement appeler LOGNRND. Si vous voulez connaître la densité de la distribution lognormale avec une moyenne et un sigma donnés à une valeur spécifique, utilisez LOGNPDF.

Étant donné que vous calculez 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)) 
+0

Nous vous remercions de votre réponse. Je ne veux pas sélectionner une valeur aléatoire à partir des tailles de grain, c'est-à-dire de la distribution log-normale. Je veux la probabilité de leurs occurrences étant donné leur écart moyen et standard, et aussi donné la gamme de la distribution. En outre, je sais que 90% des grains (en poids) se situent entre 1,19 et 0,59 tandis que le reste se situe entre 0,59 et 0,42 granulométrie. – Pupil

+0

@Harpreet: Avez-vous regardé mon édition? Avez-vous tracé la distribution? La distribution lognormale culmine à 'exp (0.84)', pas à 0.84, et donc seulement 1.3% des valeurs se situent dans la fourchette où vous attendez 90%. Aussi, que voulez-vous dire par la probabilité des occurrences? Si c'est la valeur de la fonction de densité de probabilité, c'est-à-dire la probabilité de tirer une valeur spécifique d'une distribution, j'ai calculé cela pour vous comme "poids". – Jonas

+0

Jonas, j'ai regardé tout ce que tu as dit. Je veux dire pdf (quand j'ai dit la probabilité d'occurrences). Je ne suis pas en mesure de voir aucun signe de distribution lognormale dans les données données. C'est plus comme un bruit de zigzag en forme. Comment le pic se produit-il à exp (0.84)? Ne devrait-il pas être log (0.84) à la place? Pour éviter de compliquer la complexité de la communication, ma question est la suivante: Je veux développer une distribution lognormale avec une plage [0.30.1.19], dont les quelques éléments sont donnés en 'D'. La moyenne devrait être de 0,84 et l'écart type aussi petit que possible. Également donné est que les 90% de cdf se situe entre 0.59 et 1.19. – Pupil

0

Il semble que vous cherchiez à générer des nombres aléatoires lognormaux tronqués. Si mon hypothèse est correcte, vous pouvez utiliser le rejection sampling ou le inverse transform sampling pour générer les échantillons nécessaires. Avertissement: L'échantillonnage de rejet est très inefficace si vos limites sont très éloignées de la moyenne.

Rejet d'échantillonnage

Si x ~ lognormales (mu, sigma) I (lb < x < ub)

Générez ensuite, x ~ lognormales (mu, sigma) et accepter le tirage au sort si lb < x < ub.

transformée inverse échantillonnage

Si x ~ lognormales (mu, sigma) I (lb < x < ub) puis

CDF (x) = phi ((log (x) - mu)/sigma)/(phi ((log (ub) - mu)/sigma) - phi ((log (lb) - mu)/sigma))

Générer, u ~ Uniforme (0,1).

Définir, CDF (x) = u et inverser pour x.

En d'autres termes,

x = exp (mu + sigma * phi_inverse (u * (phi ((log (ub) - mu)/sigma) - phi ((log (lb) - mu)/sigma))))

+0

Ma distribution lognormale est tronquée. Ces tailles de grains données ici sont prélevées sur l'ensemble de l'échantillon disponible. Bien que les tailles de grain suivent la distribution lognormale, mais je ne suis pas sûr si ces valeurs tronquées du lot entier suivraient la même distribution. Je ne veux pas que mes nombres aléatoires soient tronqués. Ils devraient être entre 0 et 1 représentant mes pourcentages de poids. – Pupil

+0

Vous devriez envisager d'utiliser une terminologie standard pour éviter toute confusion. Quand vous parlez de pourcentages en poids, voulez-vous dire la probabilité que la taille d'un grain se situe entre deux valeurs ou voulez-vous dire le format PDF associé à une taille de grain particulière? Vous dites que votre distribution est tronquée, mais vous dites que vous ne voulez pas que vos nombres aléatoires soient tronqués. Ce sont des déclarations contradictoires. – vad

+0

Je veux dire pdf associé à une taille de grain particulière. Je veux que tous mes nombres aléatoires (pdf) soient générés en considérant que cette distribution donnée est complète. Bien que plus de valeurs dans la distribution (pas en dehors de la plage donnée) pourraient être ajoutées, mais je ne sais pas comment faire cela. – Pupil

Questions connexes