Kommentarer
t plottar en sekvens av datavärden för att se distribution. Representerar $ r $ redan en frekvens eller sannolikhetstäthet för datavärdena?
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) )
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.
dput(r)
för att generera en sträng som enkelt kan kopieras ' n '. Nu måste vi ange data i r manuellt …