Reacties
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) )
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.
dput(r)
om een string te genereren die gemakkelijk kan worden gekopieerd ' n ' plakbaar. Nu moeten we de gegevens in r handmatig invoeren …R
oplossing voor een discrete variabele zoals uwIndex
verschijnt op stats.stackexchange. com / a / 43004/919 ; eenR
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 .