<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Denna fråga har redan svar här :

Kommentarer

  • r är helt klart inte normalt. Dess fördelning är rätt skev (många små värden nära 0, få stora värden). Du kommer att se detta genom att skriva " hist (r) ".
  • Tips! Använd dput(r) för att generera en sträng som enkelt kan kopieras ' n '. Nu måste vi ange data i r manuellt …
  • @RasmusB å å tack, jag letade efter det kommandot 🙂 Jag redigerade frågan.
  • Du <

t plottar en sekvens av datavärden för att se distribution. Representerar $ r $ redan en frekvens eller sannolikhetstäthet för datavärdena?

  • Jag har svarat på den här frågan flera gånger i flera sammanhang. En R -lösning för en diskret variabel som din Index visas vid stats.stackexchange. com / a / 43004/919 ; en R -lösning för en kontinuerlig variabel är vid stats.stackexchange.com/questions/70153/… ; och en Excel-lösning finns på stats.stackexchange.com/a/11563/919 .
  • Svar

    Det finns en skillnad mellan montering av en gaussisk distribution och montering av en gaussisk densitetskurva . Vad normalmixEM gör är det förra. Vad du vill är (antar jag) det senare.

    Att montera en distribution är ungefär vad du skulle göra om du gjorde ett histogram av dina data och försökte se vilken form den hade. Det du istället gör är att helt enkelt plotta en kurva. Den kurvan har en puckel i mitten, som vad du får genom att plotta en gaussisk densitetsfunktion.

    För att få vad du vill, du kan använda något som optim för att anpassa kurvan till dina data. Följande kod använder olinjära minsta kvadrater för att hitta de tre parametrarna som ger den bäst passande gaussiska kurvan: m är det gaussiska medelvärdet, s är standardavvikelsen och k är en godtycklig skalningsparameter (eftersom den gaussiska densiteten är begränsad till att integreras till 1, medan dina data inte är ”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

    • Spelade runt med den här lösningen men du slog mig 🙂 När jag spelade runt märkte jag att de ursprungliga startvärdena som ges till optim betydde mycket , så se till att kontrollera passformen grafiskt när du använder den här metoden.

    An svara

    Jag föreslår att använda icke-linjära minsta kvadrater för denna analys.

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

    Och från utgången kunde jag få följande monterade ”Gaussiska kurva”:

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

    ange bildbeskrivning här

    Passformen är inte fantastisk … Skulle ”ta $ x \ mapsto \ sin (x) / x $ funktion vara en bättre modell?

    Kommentarer

    • Tack. Jag får kvarvarande summan av kvadrater: 0.01997. Jag tror att jag får exakt samma sak med lösningen från Hong Ooi ovan. Är algo samma? Hur plottar jag också resultatet av nls?
    • Ja, algoritmerna är desamma i den meningen att om de fungerar (don ' t fastnar i vissa lokalt minimum) ger de samma svar. Beroende på värdet som ges till method= kan de vara exakt samma.
    • Jag lade till två rader för att generera plot.

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *