2010-12-07 18 views
12

Ich untersuche einige Daten, also wollte ich zuerst versuchen, eine normale (Gaußsche) Verteilung darauf zu legen. Dies ist das erste Mal, dass ich das in R versuche, also nehme ich einen Schritt nach dem anderen. Ichversuchen, ursprüngliche und angepasste Daten (nls + dnorm) mit geom_smooth von ggplot2 anzuzeigen()

fit = nls(counts ~ N * dnorm(size, m, s), data=myhist, start=c(m=20, s=5, N=sum(myhist$counts))) 

Dann: Zuerst habe ich vor-binned meine Daten:

myhist = data.frame(size = 10:27, counts = c(1L, 3L, 5L, 6L, 9L, 14L, 13L, 23L, 31L, 40L, 42L, 22L, 14L, 7L, 4L, 2L, 2L, 1L)) 

qplot(x=size, y=counts, data=myhist) 

plot1

Da ich zählt will, ich brauche einen Normalisierungsfaktor (N) hinzufügen, um die Dichte zu vergrößern erstellen Sie die Einbaudaten für die Anzeige und alles funktioniert super:

x = seq(10,30,0.2) 
fitted = data.frame(size = x, counts=predict(fit, data.frame(size=x))) 
ggplot(data=myhist, aes(x=size, y=counts)) + geom_point() + geom_line(data=fitted) 

plot2

Ich habe aufgeregt, als ich diesen Thread gefunden, die über die Verwendung von geom_smooth spricht() alles in einem Schritt zu tun, aber ich kann es nicht funktionieren:

Hier ist, was ich versuche, ... und was ich bekommen:

ggplot(data=myhist, aes(x=size, y=counts)) + geom_point() + geom_smooth(method="nls", formula = counts ~ N * dnorm(size, m, s), se=F, start=list(m=20, s=5, N=300, size=10)) 

Error in method(formula, data = data, weights = weight, ...) : 
    parameters without starting value in 'data': counts 

der Fehler scheint darauf hinzudeuten, dass es, für die beobachtete Variable zu passen versucht zählen, aber das macht keinen Sinn, und es Freaks vorhersagbar, ob ich auch einen „Start“ Wert für Zählungen angeben:

fitting parameters ‘m’, ‘s’, ‘N’, ‘size’, ‘counts’ without any variables 

Error in eval(expr, envir, enclos) : object 'counts' not found 

Jede Idee, was ich falsch mache? Es ist natürlich nicht das Ende der Welt, aber weniger Schritte sind immer besser, und Sie finden immer die elegantesten Lösungen für diese alltäglichen Aufgaben.

Vielen Dank im Voraus!

Jeffrey

+1

Sie erwähnen, dass Sie die Daten erkunden. Ist es notwendig, dass der Fit 'nls' ist? Mit einem einfachen 'ggplot (myhist, aes (x = Größe, y = zählt)) + geom_point() + geom_smooth()' erhält man einen Löß-Fit (glaube ich) mit weniger Aufwand. Ich hoffe, dass jemand erklären wird, wie man 'nls' zur Arbeit bringt, obwohl ... eher verwirrend. –

+0

Ich komme (widerwillig) zu Statistiken aus den Naturwissenschaften, also "explore" neigt dazu, "Zeit zu Gaußschen passen!". Im Ernst, ich habe einige großartige Quellen gefunden, wie Riccis "Fitting Distributionen in R" (http://cran.r-project.org/doc/contrib/Ricci-distributions-en.pdf) und diese Antwort auf fitdistr () (http://stackoverflow.com/questions/4290081/fitting-data-to-distributions), aber keiner der älteren Sachen verwendet ggplot2. –

Antwort

16

der erste Fehler zeigt an, dass die Variable nicht ggplot2 'count' finden kann, die in der Formel verwendet wird, in Daten.

Die Statistiken werden nach dem Mapping durchgeführt, also Größe -> x, und zählt -> y. Hier

ist ein Beispiel für die Verwendung von NLS in geom_smooth:

ggplot(data=myhist, aes(x=size, y=counts)) + geom_point() + 
    geom_smooth(method="nls", formula = y ~ N * dnorm(x, m, s), se=F, 
       start=list(m=20, s=5, N=300)) 

Der Punkt ist, dass die Verwendung von x und y, anstelle von Größe und Zählungen, die in der Beschreibung der Formel.

+0

Danke, kohske - das erklärt es! –