Dette spørgsmål har allerede svar her :

Kommentarer

  • r er helt klart ikke normalt. Dens fordeling er ret skæv (mange små værdier tæt på 0, få store værdier). Du kan se dette ved at skrive " hist (r) ".
  • Tip! Brug dput(r) til at generere en streng, der let kan kopieres ' n '. Nu skal vi indtaste dataene i r manuelt …
  • @RasmusB å å tak, jeg var på udkig efter den kommando 🙂 Jeg redigerede spørgsmålet.
  • Du don ' t plotter en sekvens af dataværdier for at se fordeling. Er $ r $ allerede en frekvens eller sandsynlighedstæthed for dataværdier?
  • Jeg har besvaret dette spørgsmål flere gange i flere sammenhænge. En R -løsning til en diskret variabel som din Index vises ved stats.stackexchange. com / a / 43004/919 ; en R løsning til en kontinuerlig variabel er ved stats.stackexchange.com/questions/70153/… ; og en Excel-løsning findes på stats.stackexchange.com/a/11563/919 .

Svar

Der er en forskel mellem montering af en gaussisk distribution og montering af en gaussisk tæthedskurve . Hvad normalmixEM laver er det førstnævnte. Det, du vil have, er (tror jeg) det sidstnævnte.

At montere en distribution er groft sagt hvad du ville gøre, hvis du lavede et histogram af dine data og forsøgte at se, hvilken form den havde. Hvad du i stedet laver, er simpelthen at tegne en kurve. Denne kurve har tilfældigvis en pukkel i midten, ligesom hvad du får ved at tegne en gaussisk densitetsfunktion.

For at få det, du vil, skal du kan bruge noget som optim til at tilpasse kurven til dine data. Følgende kode bruger ikke-lineære mindste kvadrater til at finde de tre parametre, der giver den bedst passende gaussiske kurve: m er det gaussiske gennemsnit, s er standardafvigelsen, og k er en vilkårlig skaleringsparameter (siden den gaussiske tæthed er begrænset til at integrere til 1, hvorimod dine data 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

  • Spillede rundt med denne løsning, men du slog mig 🙂 Når jeg spillede rundt, bemærkede jeg, at de indledende startværdier, der blev givet til optim, betød meget , så Sørg for at kontrollere pasformen grafisk, når du bruger denne metode.

An svare

Jeg foreslår at bruge ikke-lineære mindste kvadrater til denne 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)) 

Og fra output kunne jeg få følgende monterede “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) ) 

indtast billedebeskrivelse her

Tilpasningen er ikke fantastisk … Ville “ta $ x \ mapsto \ sin (x) / x $ funktion være en bedre model?

Kommentarer

  • Tak. Jeg får resterende sum af kvadrater: 0,01997. Jeg tror, jeg får nøjagtig det samme med løsningen fra Hong Ooi ovenfor. Er algo den samme? Hvordan plotter jeg også resultatet af nls?
  • Ja, algoritmerne er de samme i den forstand, at hvis de fungerer (ikke ' ikke sidde fast i nogle lokalt minimum) de giver det samme svar. Afhængig af den værdi, der er givet til method=, kan de være nøjagtigt de samme.
  • Jeg tilføjede to linjer for at generere plottet.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *