2010-12-07 18 views
12

Estoy explorando algunos datos, así que lo primero que quería hacer era intentar ajustar una distribución normal (gaussiana). Esta es la primera vez que intento esto en R, así que lo estoy tomando paso por paso. En primer lugar me pre-binned mis datos:tratando de mostrar los datos originales y ajustados (nls + dnorm) con geom_smooth de ggplot2()

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

Ya que quiero recuento, tengo que añadir un factor normalización (N) para ampliar la densidad:

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

Entonces crear los datos ajustados para la pantalla y todo funciona bien:

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

me emocioné cuando me encontré con este hilo que habla sobre el uso de geom_smooth() para hacerlo todo en un solo paso, pero no puedo hacerlo funcionar:

Aquí es lo que intento ... y lo que me sale:

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 

el error parece indicar que está tratando de encajar para la variable observada, cuenta, pero eso no tiene ningún sentido, y que previsiblemente se asusta si especifica un valor "de partida" para el recuento demasiado:

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

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

Alguna idea de lo que estoy haciendo mal? No es el fin del mundo, por supuesto, pero menos pasos son siempre mejores, y ustedes siempre aportan las soluciones más elegantes para estas tareas comunes.

¡Gracias de antemano!

Jeffrey

+1

Mencione que está explorando los datos. ¿Es necesario que el ajuste sea 'nls'? Usando un simple 'ggplot (myhist, aes (x = size, y = count)) + geom_point() + geom_smooth()' te da un Loess Fit (creo) con menos alboroto. Espero que alguien explique cómo hacer que 'nls' funcione, aunque ... bastante desconcertante. –

+0

Vengo (a regañadientes) a las estadísticas de las ciencias naturales, por lo que "explorar" tiende a significar "¡tiempo para adaptarse a los gaussianos!". En serio, sin embargo, he encontrado algunos recursos geniales como "Fitting Distributions in R" de Ricci (http://cran.r-project.org/doc/contrib/Ricci-distributions-en.pdf) y esta respuesta SO sobre fitdistr () (http://stackoverflow.com/questions/4290081/fitting-data-to-distributions), pero ninguna de las cosas más antiguas usa ggplot2. –

Respuesta

16

el primer error indica que ggplot2 no puede encontrar el 'recuento' variable, que se utiliza en la fórmula, en los datos.

Las estadísticas tienen lugar después del mapeo, es decir, tamaño -> x, y conteos -> y.

Aquí se muestra un ejemplo para el uso de nls en 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)) 

El punto es que el uso de x e y, en lugar de tamaño y recuento, en la especificación de la fórmula.

+0

Gracias, kohske - ¡eso lo explica! –

Cuestiones relacionadas