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)
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)
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
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. –
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. –