Deze vraag heeft hier al antwoorden :

Reacties

  • r is duidelijk niet normaal. De verdeling is recht scheef (veel kleine waarden dichtbij 0, weinig grote waarden). U kunt dit zien door " hist (r) " te typen.
  • Tip! Gebruik dput(r) om een string te genereren die gemakkelijk kan worden gekopieerd ' n ' plakbaar. Nu moeten we de gegevens in r handmatig invoeren …
  • @RasmusB å å bedankt, ik was op zoek naar dat commando 🙂 Ik heb de vraag bewerkt.
  • U hoeft ' niet een reeks gegevenswaarden te plotten om de distributie. Vertegenwoordigt $ r $ al een frequentie of waarschijnlijkheidsdichtheid van gegevenswaarden?
  • Ik heb deze vraag meerdere keren in verschillende contexten beantwoord. Een R oplossing voor een discrete variabele zoals uw Index verschijnt op stats.stackexchange. com / a / 43004/919 ; een R oplossing voor een continue variabele bevindt zich op stats.stackexchange.com/questions/70153/… ; en een Excel-oplossing is op stats.stackexchange.com/a/11563/919 .

Antwoord

Er is een verschil tussen het passen van een gaussische verdeling en het passen van een gaussische dichtheidscurve . Wat normalmixEM doet is het eerste. Wat je wilt is (denk ik) het laatste.

Het aanpassen van een distributie is grofweg wat je zou doen als je een histogram hebt gemaakt van uw gegevens, en probeerde te zien welke vorm het had. Wat je in plaats daarvan doet, is gewoon een curve uitzetten. Die curve heeft toevallig een bult in het midden, zoals wat je krijgt door een Gaussiaanse dichtheidsfunctie uit te zetten.

Om te krijgen wat je wilt, moet je kan zoiets als optim gebruiken om de curve aan uw gegevens te passen. De volgende code gebruikt niet-lineaire kleinste kwadraten om de drie parameters te vinden die de best passende gaussiaanse curve geven: m is het gaussiaanse gemiddelde, s is de standaarddeviatie en k is een willekeurige schaalparameter (aangezien de Gaussiaanse dichtheid is beperkt tot 1, terwijl uw gegevens niet “t) zijn.

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)) 

Reacties

  • Speelde met deze oplossing, maar je versloeg me 🙂 Tijdens het spelen merkte ik dat de initiële startwaarden die aan optim werden gegeven veel deden, dus als je deze methode gebruikt, zorg er dan voor dat je de fit grafisch controleert.

An swer

Ik stel voor om niet-lineaire kleinste kwadraten te gebruiken voor deze 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)) 

En uit de output kon ik de volgende passende “Gaussiaanse curve” verkrijgen:

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) ) 

voer de beschrijving van de afbeelding hier in

De match is niet geweldig … Zou de $ x \ mapsto \ sin (x) / x $ -functie een beter model?

Reacties

  • Bedankt. Ik krijg de resterende som van de kwadraten: 0,01997. Ik denk dat ik precies hetzelfde krijg met de oplossing van Hong Ooi hierboven. Is de algo hetzelfde? En hoe plot ik het resultaat van nls?
  • Ja, de algoritmen zijn hetzelfde in de zin dat als ze werken (don ' niet vast komen te zitten in sommige lokaal minimum) geven ze hetzelfde antwoord. Afhankelijk van de waarde die is gegeven aan method= kunnen ze exact hetzelfde zijn.
  • Ik heb twee regels toegevoegd om de plot te genereren.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *