2016-06-28 19 views
0

Ich habe eine Liste Daten wie unten. Ich möchte Gauß-Kurve nicht-lineare Regression und zählt Einpassen zwischen mids für jedes Element meiner Liste und Bericht ausführen Mittelwert und Standardabweichungberechnen Gauss-Kurve passend auf einer Liste

mylist<- structure(list(A = structure(list(breaks = c(-10, -9, 
-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4), counts = c(1L, 
0L, 1L, 5L, 9L, 38L, 56L, 105L, 529L, 2858L, 17L, 2L, 0L, 2L), 
    density = c(0.000276014352746343, 0, 0.000276014352746343, 
    0.00138007176373171, 0.00248412917471709, 0.010488545404361, 
    0.0154568037537952, 0.028981507038366, 0.146011592602815, 
    0.788849020149048, 0.00469224399668783, 0.000552028705492686, 
    0, 0.000552028705492686), mids = c(-9.5, -8.5, -7.5, -6.5, 
    -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5), 
    xname = "x", equidist = TRUE), .Names = c("breaks", "counts", 
"density", "mids", "xname", "equidist"), class = "histogram"), 
    B = structure(list(breaks = c(-7, -6, -5, 
    -4, -3, -2, -1, 0), counts = c(2L, 0L, 6L, 2L, 2L, 1L, 3L 
    ), density = c(0.125, 0, 0.375, 0.125, 0.125, 0.0625, 0.1875 
    ), mids = c(-6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5), xname = "x", 
     equidist = TRUE), .Names = c("breaks", "counts", "density", 
    "mids", "xname", "equidist"), class = "histogram"), C = structure(list(
     breaks = c(-7, -6, -5, -4, -3, -2, -1, 0, 1), counts = c(2L, 
     2L, 4L, 5L, 14L, 22L, 110L, 3L), density = c(0., 
     0., 0.0246913580246914, 0.0308641975308642, 
     0.0864197530864197, 0.135802469135802, 0.679, 
     0.0185185185185185), mids = c(-6.5, -5.5, -4.5, -3.5, 
     -2.5, -1.5, -0.5, 0.5), xname = "x", equidist = TRUE), .Names = c("breaks", 
    "counts", "density", "mids", "xname", "equidist"), class = "histogram")), .Names = c("A", 
"B", "C")) 

Ich habe diese Fitting a density curve to a histogram in R aber dies ist, wie ein passen Kurve zu einem Histogramm. was ich will, ist das Best-Fit-Werte“

"Mean" "SD"

Wenn ich PRISM verwenden, es zu tun, sollte ich die folgenden Ergebnisse für A

Mids Counts 
-9.5 1 
-8.5 0 
-7.5 1 
-6.5 5 
-5.5 9 
-4.5 38 
-3.5 56 
-2.5 105 
-1.5 529 
-0.5 2858 
0.5  17 
1.5  2 
2.5  0 
3.5  2 

Durchführung nichtlinearen erhalten Regression Gaußsche Kurvenanpassung, ich

"Best-fit values" 
"  Amplitude" 3537 
"  Mean"  -0.751 
"  SD"   0.3842 

für den zweiten Satz B

Mids Counts 
-6.5 2 
-5.5 0 
-4.5 6 
-3.5 2 
-2.5 2 
-1.5 1 
-0.5 3 



"Best-fit values" 
"  Amplitude" 7.672 
"  Mean"   -4.2 
"  SD"   0.4275 

und für die dritte

Mids Counts 
-6.5 2 
-5.5 2 
-4.5 4 
-3.5 5 
-2.5 14 
-1.5 22 
-0.5 110 
0.5  3 

Ich erhalte diese

"Best-fit values" 
"  Amplitude" 120.7 
"  Mean"  -0.6893 
"  SD"  0.4397 
+0

Wenn Sie nach dem geschätzten Mittelwert und der Standardabweichung/Varianz suchen, denke ich, dass dies durch ein Maximum-Likelihood-Verfahren erreicht werden kann. Es gibt die Funktion 'mle' in der Basis R sowie das Paket' maxLik'. In diesem Fall sollten Sie die Rohdaten anstelle von Mitten und Zählwerten verwenden. Das erste Beispiel in "mle" sollte analog zu dem sein, was Sie wollen. – lmo

+0

Ich kann im Moment keine Videos sehen, aber werde es in ein paar Stunden sehen, wenn ich dazu in der Lage bin. Es scheint, dass das Schätzen von gebinnten Daten an nützlichen Informationen verliert. Dies ist besonders bedenklich angesichts der Tatsache, dass Sie eine so kleine Stichprobe haben: 16 denke ich. – lmo

+0

@lmo Ok, nicht wirklich die Stichprobengröße ist viel viel höher wie 1000. so wäre kein Problem in diesem Fall denke ich – nik

Antwort

1

Um das Histogramm zurück auf die Schätzung der Mittelwert und Standardabweichung zu konvertieren. Konvertieren Sie zuerst die Ergebnisse der Bin-Zählungen mit dem Bin. Dies wird eine Annäherung der ursprünglichen Daten sein.

Basierend auf dem obigen Beispiel:

#extract the mid points and create list of simulated data 
simdata<-lapply(mylist, function(x){rep(x$mids, x$counts)}) 
#if the original data were integers then this may give a better estimate 
#simdata<-lapply(mylist, function(x){rep(x$breaks[-1], x$counts)}) 

#find the mean and sd of simulated data 
means<-lapply(simdata, mean) 
sds<-lapply(simdata, sd) 
#or use sapply in the above 2 lines depending on future process needs 

Wenn Ihre Daten wurden dann ganze Zahlen der Pausen mit wie die Behälter eine bessere Schätzung geben. Abhängig von der Funktion für das Histogramm (dh rechts = WAHR/FALSCH) können die Ergebnisse um eins verschoben werden.

bearbeiten

Ich dachte, das leicht gefallen sein würde. Ich überprüfte das Video gezeigt, die Beispieldaten waren:

mids<-seq(-7, 7) 
counts<-c(7, 1, 2, 2, 2, 5, 217, 70, 18, 0, 2, 1, 2, 0, 1) 
simdata<-rep(mids, counts) 

Die Video-Ergebnisse waren Mittelwert = -0,7359 und sd = 0,4571. Die Lösung, die ich gefunden, sofern die nächsten Ergebnisse wurden mit dem „fitdistrplus“ Paket mit:

fitdist(simdata, "norm", "mge") 

Mit der „Maximierung der Güte der Anpassung Schätzung“ ergab Mittelwert = -,7597280 und sd = 0,8320465.
An dieser Stelle bietet die obige Methode eine enge Schätzung, stimmt aber nicht genau überein. Ich weiß nicht, mit welcher Technik die Anpassung aus dem Video berechnet wurde.

Edit # 2

Die obigen Lösungen die ursprünglichen Daten handelt Neuerstellung und passend, dass entweder die mittlere/sd oder mit dem fitdistrplus Paket. Dieser Versuch ist ein Versuch, unter Verwendung der Gauß'schen Verteilung eine Anpassung nach der Methode der kleinsten Quadrate durchzuführen.

simdata<-lapply(mylist, function(x){rep(x$mids, x$counts)}) 
means<-sapply(simdata, mean) 
sds<-sapply(simdata, sd) 

#Data from video 
#mids<-seq(-7, 7) 
#counts<-c(7, 1, 2, 2, 2, 5, 217, 70, 18, 0, 2, 1, 2, 0, 1) 

#make list of the bins and distribution in each bin 
mids<-lapply(mylist, function(x){x$mids}) 
dis<-lapply(mylist, function(x) {x$counts/sum(x$counts)}) 

#function to perform the least square fit 
nnorm<-function(values, mids, dis) { 
    means<-values[1] 
    sds<-values[2] 
    #print(paste(means, sds)) 
    #calculate out the Gaussian distribution for each bin 
    modeld<-dnorm(mids, means, sds) 
    #sum of the squares 
    diff<-sum((modeld-dis)^2) 
    diff 
} 

#use optim function with the mean and sd as initial guesses 
#find the mininium with the mean and SD as fit parameters 
lapply(1:3, function(i) {optim(c(means[[i]], sds[[i]]), nnorm, mids=mids[[i]], dis=dis[[i]])}) 

Diese Lösung bietet eine genauere Antwort auf PRISM-Ergebnisse, aber immer noch nicht die gleiche. Hier ist ein Vergleich aller 4 Lösungen. enter image description here

Aus der Tabelle ergibt sich die kleinste Annäherung (die gerade oben) am nächsten. Vielleicht hilft das Optimieren der Midnorm-Funktion. Aber die Daten von Fall B sind am weitesten von der normalen Verteilung entfernt, aber die PRISM-Software erzeugt immer noch eine kleine Standardabweichung, während die anderen Methoden ähnlich sind. Es ist möglich, dass die PRISM-Software eine Art von Datenfilterung durchführt, um die Ausreißer vor der Anpassung zu entfernen.

+0

bist du dir sicher, dass man dabei nichtlineare Regressions-Gaußkurven anpasst ??? – nik

+0

Hallo, ich überprüfte die obigen Daten und ich verwendete PRISM, um die nichtlineare Regressions-Gauß'sche Kurvenanpassung aufzubauen, und ich erhielt den Durchschnitt und die Standardabweichung. Kannst du bitte sehen, ob es gleich ist? – nik

+0

Die Werte stimmen nicht überein. Ich weiß nicht, wie die PRISM-Software die Anpassung durchführt. Es könnte Clipping oder Glättung der Schwänze für die Anpassung sein. Ihr Fall B ist nicht sehr normal, aber PRISM erzeugt eine Standardabweichung von <0.5 – Dave2e