Estimation de la distribution à partir des données

12

J'ai un échantillon de données générées Rpar rnorm(50,0,1), donc les données prennent évidemment une distribution normale. Cependant, Rne "connaît" pas ces informations de distribution sur les données.

Existe-t-il une méthode Rpermettant d'estimer le type de distribution dont provient mon échantillon? Sinon, je vais utiliser la shapiro.testfonction et procéder de cette façon.

James Highbright
la source
Je ne suis pas sûr de reconnaître le résultat de cette question. Il est vrai que si vous n'avez qu'un vecteur de nombres dans R, il n'y a pas beaucoup de métadonnées associées, mais pourquoi cela vous dérangerait-il? Pourquoi auriez-vous besoin de cela / que voudriez-vous en faire? Supposons qu'il en ait, il ne serait utile que dans la mesure où vous deviez passer ce vecteur à une fonction avec des méthodes spécifiques pour les données gaussiennes par rapport à d'autres. Je n'en connais aucun (même si je ne suis guère l'utilisateur R le plus expert au monde).
gung - Rétablir Monica
Si vous voulez simplement tester si un échantillon donné semble normal, le test de Shapiro-Wilk est une option décente (même si cela vaut la peine de lire cette question et les réponses qui y sont données). Je peux voir comment cela pourrait arriver dans une étude de simulation, mais sans plus de détails sur l'étude, il est difficile de donner une réponse utile.
gung - Réintégrer Monica
Pourquoi avez-vous besoin d'identifier une distribution pour les données? Le choix de distribution automatique est souvent une idée intéressante, mais cela n'en fait pas une bonne idée.
Glen_b -Reinstate Monica

Réponses:

21

Il y a la fitdistrfonction dans le package MASS ou certaines des fonctions dans le package fitdistrplus . Voici quelques exemples de ce dernier.

require(fitdistrplus)

set.seed(1)
dat <- rnorm(50,0,1)
f1 <- fitdist(dat,"norm")
f2 <- fitdist(dat,"logis")
f3 <- fitdist(dat,"cauchy")

donc par exemple

> f1
Fitting of the distribution ' norm ' by maximum likelihood 
Parameters:
      estimate Std. Error
mean 0.1004483 0.11639515
sd   0.8230380 0.08230325

et vous pouvez voir les parcelles avec

plotdist(dat,"norm",para=list(mean=f1$estimate[1],sd=f1$estimate[2]))
plotdist(dat,"logis",para=list(location=f2$estimate[1],scale=f2$estimate[2]))
plotdist(dat,"cauchy",para=list(location=f3$estimate[1],scale=f3$estimate[2]))

il semble donc plausible comme une distribution normale

entrez la description de l'image ici

mais aussi peut-être comme une distribution logistique (vous aurez besoin d'un plus grand échantillon pour les distinguer dans les queues)

entrez la description de l'image ici

mais avec un qqplot et en regardant le CDF, vous pouvez dire que ce n'est probablement pas une distribution de Cauchy

entrez la description de l'image ici

Henri
la source
1
Merci Henry pour une belle vue d'ensemble. On m'a demandé s'il existe des packages qui prennent les données et crachent quelle distribution (et paramètres) crache le mieux. Êtes-vous au courant d'une telle fonctionnalité dans l'un des packages?
Roman Luštrik
3
fitdistfournit des estimations des paramètres. Il y a quelques indices sur la distribution des fonctions telles que descdist(dat, boot = 1000)mais elles bénéficieraient également d'un plus grand échantillon.
Henry
Aucune de ces fonctions ne résoudra le problème que vous avez posé dans votre dernière question lorsque l'échantillon n'est pas représentatif.
John
1
@Scott Kaiser: Je ne pense pas. fitdist()est une fonction du package fitdistrplus, et c'est ce que j'utilisais. Pendant ce temps, fitdistr()est une fonction du package MASS et ne fonctionnerait pas ici sous cette forme.
Henry
1
Je n'ai pas assez de points pour ajouter ceci en tant que commentaire, mais tout comme une note supplémentaire aux informations fournies dans le fil ci-dessus, il est également possible d'appeler simplement plot(f1)au lieu du plus compliquéplotdist(dat,"norm",para=list(mean=f1$estimate[1],sd=f1$estimate[2]))
swestenb