2016-05-26 12 views
-1

Ich versuche, eine Beta-Verteilung auf ein Histogramm aus empirischen Daten anzupassen.Fit Verteilung auf empirische Daten

Das Problem, auf das ich stoße, ist, dass die angepasste Verteilung viel höher ist als die Balken im ursprünglichen Histogramm.

Die Originaldaten liegen außerhalb des Bereichs von [0,1]. Dies ist der Bereich, in dem die Beta-Verteilung ausgewertet werden kann. Daher skaliere ich die Originaldaten so, dass sie im Intervall [0,1] liegt.

Hier ist mein Code:

load("https://www.dropbox.com/s/c3psxx8jjbc20mo/data.Rdata?dl=0") 

    #create histogram with values normalized between 0 and 1 
    h <- hist((data-min(data))/(max(data)-min(data)),lty="blank",col="grey") 
    #normalize the density so the y-axis goes from 0 to 1 
    h$density <- h$counts/max(h$counts) 
    #plot the results 
    plot(h,freq=FALSE,cex.main=1,cex.axis=1,yaxt='n',ylim=c(0,1.5),col='grey',lty='blank',xaxt='n') 
    axis(2,at=seq(0,1,0.5),labels=seq(0,1,0.5)) 
    axis(1,at=seq(0,1,0.5),labels=seq(0,1,0.5)) 

    #fit beta distribution 
    a <- (data-min(data))/(max(data)-min(data)) 
    a[a==1] <- 0.9999 
    a[a==0] <- 0.0001 
    fit.beta <- suppressWarnings(fitdistr(a, "beta", start = list(shape1=0.1, shape2=0.1))) 

    #overlay curve from beta distribution 
    alpha <- fit.beta$estimate[1] 
    beta <- fit.beta$estimate[2] 
    b <- rbeta(length(data),alpha,beta) 
    lines(density(b)) 

enter image description here

Was bin ich?

+1

„normalisieren die Dichte so die y-Achse von 0 bis 1 geht“ Warum, dass Sie tun: weil es nicht die schönen Eigenschaften der beta-Verteilung zu verwenden ist? Dichtewerte sind nicht auf das Intervall [0, 1] beschränkt. – Roland

+0

Siehe http://stackoverflow.com/questions/37375961/my-density-plot-in-r-has-values-beyond-1-how-can-i-fix-this/37378212#37378212 für einen Beitrag im Zusammenhang mit Rolands Kommentar. Es gibt einen Unterschied zwischen der Unterstützung ("x" -Werte) und der Entfernung ("y" -Werte). Die Unterstützung der Beta-Verteilung liegt im 0-1-Intervall. – coffeinjunky

Antwort

0

Zuerst möchten Sie hist(..., freq=TRUE) für das Histogramm verwenden. Um den y-Achsenbereich korrekt festzulegen, können Sie den maximalen Wert Ihrer Beta-Verteilung berechnen (see e.g. here). Schließlich woul es viel besser, dbeta zu verwenden, als eine zufällige Stichprobe durch Schätzen der Dichte gefolgt erzeugen:

maxibeta <- dbeta((alpha-1)/(alpha+beta-2), alpha, beta) 
hist((data-min(data))/(max(data)-min(data)), 
     prob=TRUE, col="grey", border="white", ylim=c(0, maxibeta), 
     main="Histogram + fitted distribution") 
plot(function(x) dbeta(x,alpha,beta), add=TRUE, col=2, lwd=2) 

enter image description here


EDIT: eine allgemeinere Lösung, aber das macht mich ein wenig traurig

fbeta <- function(x) dbeta(x,alpha,beta) 
maxibeta <- optimize(fbeta, interval = c(0,1), maximum = TRUE)$objective 

histo <- hist((data-min(data))/(max(data)-min(data)), plot = FALSE) 

plot(histo, freq=FALSE, col="grey", border="white", 
    ylim=c(0, max(maxibeta, max(histo$density))), 
    main="Histogram + fitted distribution") 
plot(fbeta, add=TRUE, col=2, lwd=2) 
+0

dies funktioniert im Allgemeinen, aber nicht für alle Daten. Zum Beispiel, wenn Sie es mit diesen Daten versuchen: https://www.dropbox.com/s/ola5hj2sikigtzs/data2.Rdata?dl=0 die Handlung sieht ziemlich komisch aus. Gibt es einen Weg, es flexibler zu machen? – ghb

+0

Die Formel I, die verwendet wurde, um den maximalen Wert der theoretischen Verteilung zu berechnen, ist nur dann gut, wenn beide Formparameter> 1 sind. Dies ist bei Ihrem Beispiel * data2 * nicht der Fall. –

+0

Verwenden Sie 'optimieren'? –