Dette spørsmålet har allerede svar her :

Kommentarer

  • r er tydeligvis ikke normalt. Distribusjonen er riktig skjev (mange små verdier nær 0, få store verdier). Du vil se dette ved å skrive " hist (r) ".
  • Tips! Bruk dput(r) til å generere en streng som enkelt kan kopieres ' n '. Nå må vi legge inn dataene i r manuelt …
  • @RasmusB å å takk, jeg var på utkikk etter den kommandoen 🙂 Jeg redigerte spørsmålet.
  • Du trenger ikke ' t plottet en sekvens av dataverdier for å se fordeling. Representerer $ r $ allerede en frekvens eller sannsynlighetstetthet for dataverdier?
  • Jeg har svart på dette spørsmålet flere ganger i flere sammenhenger. En R -løsning for en diskret variabel som Index vises på stats.stackexchange. com / a / 43004/919 ; en R løsning for en kontinuerlig variabel er på stats.stackexchange.com/questions/70153/… ; og en Excel-løsning er på stats.stackexchange.com/a/11563/919 .

Svar

Det er en forskjell mellom å montere en gaussisk fordeling og montere en gaussisk tetthetskurve . Hva normalmixEM gjør er førstnevnte. Det du vil ha (antar jeg) sistnevnte.

Å montere en distribusjon er, grovt sett, hva du ville gjort hvis du laget et histogram av dataene dine, og prøvde å se hva slags form den hadde. Det du i stedet gjør, er ganske enkelt å tegne en kurve. Den kurven har tilfeldigvis en pukkel i midten, som det du får ved å tegne en gaussisk tetthetsfunksjon.

For å få det du vil, du kan bruke noe sånt som optim for å tilpasse kurven til dataene dine. Følgende kode vil bruke ikke-lineære minste kvadrater for å finne de tre parametrene som gir den best passende gaussiske kurven: m er det gaussiske gjennomsnittet, s er standardavviket, og k er en vilkårlig skaleringsparameter (siden den gaussiske tettheten er begrenset til å integrere til 1, mens dataene dine ikke er «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)) 

Kommentarer

  • Lekte rundt med denne løsningen, men du slo meg 🙂 Da jeg spilte rundt, la jeg merke til at de opprinnelige startverdiene som ble gitt til optim, betydde mye , så sørg for å sjekke passformen grafisk når du bruker denne metoden.

An sv

Jeg foreslår å bruke ikke-lineære minste kvadrater til denne analysen.

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

Og fra utgangen kunne jeg oppnå følgende monterte «Gaussiske kurve»:

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

skriv inn bildebeskrivelse her

Passformen er ikke fantastisk … Ville ikke «ta $ x \ mapsto \ sin (x) / x $ funksjon være en bedre modell?

Kommentarer

  • Takk. Jeg får resterende sum av kvadrater: 0.01997. Jeg tror jeg får akkurat det samme med løsningen fra Hong Ooi ovenfor. Er algo den samme? Også hvordan tegner jeg resultatet av nls?
  • Ja, algoritmene er de samme i den forstand at hvis de fungerer (ikke ' ikke blir sittende fast i noen lokalt minimum) gir de samme svaret. Avhengig av verdien gitt til method= kan de være nøyaktig de samme.
  • Jeg la til to linjer for å generere plottet.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *