Cette question a déjà des réponses ici :

Commentaires

  • r nest clairement pas normal. Sa distribution est biaisée à droite (beaucoup de petites valeurs proches de 0, peu de grandes valeurs). Vous verrez cela en tapant " hist (r) ".
  • Astuce! Utilisez dput(r) pour générer une chaîne facilement copiable ' n ' collable. Maintenant, nous devons entrer les données dans r manuellement …
  • @RasmusB å å e merci, je recherchait cette commande 🙂 Jai édité la question.
  • Vous ne ' tracer une séquence de valeurs de données pour voir le Distribution. $ R $ déjà représente-t-il une fréquence ou une densité de probabilité de valeurs de données?
  • Jai répondu à cette question plusieurs fois dans plusieurs contextes. Une R solution pour une variable discrète comme votre Index apparaît à stats.stackexchange. com / a / 43004/919 ; une solution R pour une variable continue est à stats.stackexchange.com/questions/70153/… ; et une solution Excel est à stats.stackexchange.com/a/11563/919 .

Réponse

Il « y a une différence entre lajustement dune distribution gaussienne et lajustement dune courbe de densité gaussienne. Quest-ce que normalmixEM fait est le premier. Ce que vous voulez, cest (je suppose) le second.

Ajuster une distribution est, grosso modo, ce que vous feriez si vous faisiez un histogramme de vos données, et a essayé de voir quel type de forme il avait. Ce que vous faites, à la place, consiste simplement à tracer une courbe. Cette courbe a une bosse au milieu, comme ce que vous obtenez en traçant une fonction de densité gaussienne.

Pour obtenir ce que vous voulez, vous peut utiliser quelque chose comme optim pour ajuster la courbe à vos données. Le code suivant utilisera les moindres carrés non linéaires pour trouver les trois paramètres donnant la courbe gaussienne la mieux ajustée: m est la moyenne gaussienne, s est lécart type et k est un paramètre de mise à léchelle arbitraire (puisque la densité gaussienne est contrainte de sintégrer à 1, alors que vos données ne sont pas « t).

x <- seq_along(r) f <- function(par) { m <- par[1] sd <- par[2] k <- par[3] rhat <- k * exp(-0.5 * ((x - m)/sd)^2) sum((r - rhat)^2) } optim(c(15, 2, 1), f, method="BFGS", control=list(reltol=1e-9)) 

Commentaires

  • Jai joué avec cette solution mais tu mas battu 🙂 En jouant, jai remarqué que les valeurs de départ initiales données à optim importaient beaucoup , donc lorsque vous utilisez cette méthode, assurez-vous de vérifier lajustement graphiquement.

Un swer

Je propose dutiliser les moindres carrés non linéaires pour cette analyse.

# First present the data in a data-frame tab <- data.frame(x=seq_along(r), r=r) #Apply function nls (res <- nls( r ~ k*exp(-1/2*(x-mu)^2/sigma^2), start=c(mu=15,sigma=5,k=1) , data = tab)) 

Et à partir de la sortie, jai pu obtenir la « courbe gaussienne » ajustée suivante:

v <- summary(res)$parameters[,"Estimate"] plot(r~x, data=tab) plot(function(x) v[3]*exp(-1/2*(x-v[1])^2/v[2]^2),col=2,add=T,xlim=range(tab$x) ) 

entrez la description de limage ici

Lajustement nest pas étonnant … La fonction $ x \ mapsto \ sin (x) / x $ ne serait-elle pas une meilleur modèle?

Commentaires

  • Merci. Jobtiens la somme des carrés résiduelle: 0,01997. Je pense que jobtiens exactement la même chose avec la solution de Hong Ooi ci-dessus. Lalgo est-il le même? Aussi comment tracer le résultat de nls?
  • Oui, les algorithmes sont les mêmes dans le sens où sils fonctionnent (ne ' pas rester coincé dans certains minimum local), ils donnent la même réponse. Selon la valeur donnée à method=, ils peuvent être exactement les mêmes.
  • Jai ajouté deux lignes pour générer le graphique.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *