Francisco Javier
2016-Mar-03 20:35 UTC
[R-es] Representar datos longitudinales mediante splines
Buenas noches a todos, Me dirijo a vosotros porque estoy trabajando con medidas repetidas sobre un grupo de sujetos y quisiera graficar la evolución temporal de cada uno de ellos pero suavizada mediante un spline (o en su defecto algún tipo de línea suavizadora que no necesariamente tenga que pasar por los puntos de cada sujeto). Además, quisiera hacerlo en R básico, esto es, sin recurrir al uso de paquetes adicionales tipo lattice, ggplot2. A modo de ejemplo, tengo el siguiente data frame: df <- data.frame( id = factor(rep(c(1,2,3), c(3,4,3))), x = c( 1, 14, 22, 2, 9, 20, 25, 4, 15, 22), y = c(35, 28, 52, 79, 64, 70, 95, 45, 102, 105)) E intento (sin conseguir resultado): plot(df$x, df$y, xlab = "time", ylab="value", type="n", xlim = c(0,25), ylim=c(20,120)) for(i in unique(df$id)) { lines(lowess(df$x[df$id == i], df$y[df$id == i], col = df$id)) } points(x = df$x, y = df$y, pch=16, col = df$id) # Los datos asociados a cada id con un color de referencia title("Scatter Plot of value vs. time") ¡Muchas gracias por cualquier ayuda al respecto! Francisco [[alternative HTML version deleted]]
Javier Marcuzzi
2016-Mar-03 21:06 UTC
[R-es] Representar datos longitudinales mediante splines
Estimado Francisco Javier Puede realizar eso con xy, o la parte gráfica que prefiera (hay que intentar y se llegaría), pero en su código no veo alguna función de ajuste de curva, spline permite ajustar curvas y fijar algunos puntos, hay varias posibilidades al respecto, debería seleccionar una librería con la palabra clave spline que cree apropiada. Yo cuándo uso splines al data.frame le agrego las referencias al spline (una cantidad de columnas de acuerdo al modelo), y al realizar la gráfica la predicción correspondiente al ajunte de curvas. Javier Rubén Marcuzzi De: Francisco Javier Enviado: jueves, 3 de marzo de 2016 17:36 Para: r-help-es en r-project.org Asunto: [R-es] Representar datos longitudinales mediante splines Buenas noches a todos, Me dirijo a vosotros porque estoy trabajando con medidas repetidas sobre un grupo de sujetos y quisiera graficar la evoluci?n temporal de cada uno de ellos pero suavizada mediante un spline (o en su defecto alg?n tipo de l?nea suavizadora que no necesariamente tenga que pasar por los puntos de cada sujeto). Adem?s, quisiera hacerlo en R b?sico, esto es, sin recurrir al uso de paquetes adicionales tipo lattice, ggplot2. A modo de ejemplo, tengo el siguiente data frame: df <- data.frame( id = factor(rep(c(1,2,3), c(3,4,3))), x = c( 1, 14, 22, 2, 9, 20, 25, 4, 15, 22), y = c(35, 28, 52, 79, 64, 70, 95, 45, 102, 105)) E intento (sin conseguir resultado): plot(df$x, df$y, xlab = "time", ylab="value", type="n", xlim = c(0,25), ylim=c(20,120)) for(i in unique(df$id)) { lines(lowess(df$x[df$id == i], df$y[df$id == i], col = df$id)) } points(x = df$x, y = df$y, pch=16, col = df$id) # Los datos asociados a cada id con un color de referencia title("Scatter Plot of value vs. time") ?Muchas gracias por cualquier ayuda al respecto! Francisco [[alternative HTML version deleted]] [[alternative HTML version deleted]]
Carlos Ortega
2016-Mar-04 06:26 UTC
[R-es] Representar datos longitudinales mediante splines
Hola, El suavizado con "lowess()" te da error:> for(i in unique(df$id)) {+ lines(lowess(df$x[df$id == i], df$y[df$id == i], col = df$id)) } Error in lowess(df$x[df$id == i], df$y[df$id == i], col = df$id) : unused argument (col = df$id) Y el mensaje de error es bastante explícito. Incluyes el parámetro "col" dentro de lowess que no lo considera. Es un simple problema de dónde has colocado un paréntesis de cierre. Así sí que funciona (destaco en rojo la posición del paréntesis de cierre): #----------------- for(i in unique(df$id)) { lines(lowess(df$x[df$id == i], df$y[df$id == i]*)*, col = df$id) } points(x = df$x, y = df$y, pch=16, col = df$id) # Los datos asociados a cada id con un color de referencia title("Scatter Plot of value vs. time") #----------------- [image: Imágenes integradas 1] Saludos, Carlos Ortega www.qualityexcellence.es El 3 de marzo de 2016, 21:35, Francisco Javier <iterador10 en hotmail.com> escribió:> Buenas noches a todos, > > > Me dirijo a vosotros porque estoy trabajando con medidas repetidas sobre > un grupo de sujetos y quisiera graficar la evolución temporal de cada uno > de ellos pero suavizada mediante un spline (o en su defecto algún tipo de > línea suavizadora que no necesariamente tenga que pasar por los puntos de > cada sujeto). Además, quisiera hacerlo en R básico, esto es, sin recurrir > al uso de paquetes adicionales tipo lattice, ggplot2. > > > A modo de ejemplo, tengo el siguiente data frame: > > > df <- data.frame( > > id = factor(rep(c(1,2,3), c(3,4,3))), > x = c( 1, 14, 22, 2, 9, 20, 25, 4, 15, 22), > y = c(35, 28, 52, 79, 64, 70, 95, 45, 102, 105)) > > > E intento (sin conseguir resultado): > > > plot(df$x, df$y, xlab = "time", ylab="value", type="n", xlim = c(0,25), > ylim=c(20,120)) > for(i in unique(df$id)) { > lines(lowess(df$x[df$id == i], df$y[df$id == i], col = df$id)) } > points(x = df$x, y = df$y, pch=16, col = df$id) # Los datos > asociados a cada id con un color de referencia > title("Scatter Plot of value vs. time") > > > ¡Muchas gracias por cualquier ayuda al respecto! > > > Francisco > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160304/1d5def66/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 25195 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160304/1d5def66/attachment-0001.png>
Javier Marcuzzi
2016-Mar-04 10:59 UTC
[R-es] Representar datos longitudinales mediante splines
Estimado Carlos y Francisco El lowess no es spline http://www.inside-r.org/r-doc/stats/lowess. Por la pregunta yo pensé en algo como muchos sujetos con medidas de peso corporal a lo largo del tiempo relacionado a dietas distintas, esa fue mi analogía mental para mi respuesta anterior, donde spline se encuentra dentro de las funciones de ajuste posible. Javier Rubén Marcuzzi De: Carlos Ortega Enviado: viernes, 4 de marzo de 2016 3:27 Para: Francisco Javier CC: r-help-es en r-project.org Asunto: Re: [R-es] Representar datos longitudinales mediante splines Hola, El suavizado con "lowess()" te da error:> for(i in unique(df$id)) {+ lines(lowess(df$x[df$id == i], df$y[df$id == i], col = df$id)) } Error in lowess(df$x[df$id == i], df$y[df$id == i], col = df$id) : unused argument (col = df$id) Y el mensaje de error es bastante explícito. Incluyes el parámetro "col" dentro de lowess que no lo considera. Es un simple problema de dónde has colocado un paréntesis de cierre. Así sí que funciona (destaco en rojo la posición del paréntesis de cierre): #----------------- for(i in unique(df$id)) { lines(lowess(df$x[df$id == i], df$y[df$id == i]), col = df$id) } points(x = df$x, y = df$y, pch=16, col = df$id) # Los datos asociados a cada id con un color de referencia title("Scatter Plot of value vs. time") #----------------- Saludos, Carlos Ortega www.qualityexcellence.es El 3 de marzo de 2016, 21:35, Francisco Javier <iterador10 en hotmail.com> escribió: Buenas noches a todos, Me dirijo a vosotros porque estoy trabajando con medidas repetidas sobre un grupo de sujetos y quisiera graficar la evolución temporal de cada uno de ellos pero suavizada mediante un spline (o en su defecto algún tipo de línea suavizadora que no necesariamente tenga que pasar por los puntos de cada sujeto). Además, quisiera hacerlo en R básico, esto es, sin recurrir al uso de paquetes adicionales tipo lattice, ggplot2. A modo de ejemplo, tengo el siguiente data frame: df <- data.frame( id = factor(rep(c(1,2,3), c(3,4,3))), x = c( 1, 14, 22, 2, 9, 20, 25, 4, 15, 22), y = c(35, 28, 52, 79, 64, 70, 95, 45, 102, 105)) E intento (sin conseguir resultado): plot(df$x, df$y, xlab = "time", ylab="value", type="n", xlim = c(0,25), ylim=c(20,120)) for(i in unique(df$id)) { lines(lowess(df$x[df$id == i], df$y[df$id == i], col = df$id)) } points(x = df$x, y = df$y, pch=16, col = df$id) # Los datos asociados a cada id con un color de referencia title("Scatter Plot of value vs. time") ¡Muchas gracias por cualquier ayuda al respecto! Francisco [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es -- Saludos, Carlos Ortega www.qualityexcellence.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160304/bc25a812/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: C4E01478BC0E41A8BB6022C41BC68DDF.png Type: image/png Size: 18141 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160304/bc25a812/attachment-0001.png>
Olivier Nuñez
2016-Mar-04 13:39 UTC
[R-es] Representar datos longitudinales mediante splines
Prueba esto: ggplot(df,aes(x,x,y=y,color=id))+geom_smooth(method="gam")+geom_point() Un saludo. Olivier ----- Mensaje original ----- De: "Francisco Javier" <iterador10 en hotmail.com> Para: r-help-es en r-project.org Enviados: Jueves, 3 de Marzo 2016 21:35:57 Asunto: [R-es] Representar datos longitudinales mediante splines Buenas noches a todos, Me dirijo a vosotros porque estoy trabajando con medidas repetidas sobre un grupo de sujetos y quisiera graficar la evoluci?n temporal de cada uno de ellos pero suavizada mediante un spline (o en su defecto alg?n tipo de l?nea suavizadora que no necesariamente tenga que pasar por los puntos de cada sujeto). Adem?s, quisiera hacerlo en R b?sico, esto es, sin recurrir al uso de paquetes adicionales tipo lattice, ggplot2. A modo de ejemplo, tengo el siguiente data frame: df <- data.frame( id = factor(rep(c(1,2,3), c(3,4,3))), x = c( 1, 14, 22, 2, 9, 20, 25, 4, 15, 22), y = c(35, 28, 52, 79, 64, 70, 95, 45, 102, 105)) E intento (sin conseguir resultado): plot(df$x, df$y, xlab = "time", ylab="value", type="n", xlim = c(0,25), ylim=c(20,120)) for(i in unique(df$id)) { lines(lowess(df$x[df$id == i], df$y[df$id == i], col = df$id)) } points(x = df$x, y = df$y, pch=16, col = df$id) # Los datos asociados a cada id con un color de referencia title("Scatter Plot of value vs. time") ?Muchas gracias por cualquier ayuda al respecto! Francisco [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Carlos Ortega
2016-Mar-04 21:47 UTC
[R-es] Representar datos longitudinales mediante splines
Hola, Claro, es que con "lowes()" para la cantidad tan pequeña de datos que tienes para cada clase, no tiene mucho sentido la interpolación local que realiza "lowess" teniendo en cuenta los puntos próximos. Fíjate que si no diferencias entre las clases de cada punto, sí que "lowess()" interpola: plot(df$x, df$y, xlab = "time", ylab="value", type="n", xlim = c(0,25), ylim=c(20,120)) lines(lowess(df$x, df$y, f=2/3)) points(x = df$x, y = df$y, pch=16) [image: Imágenes integradas 1] El 4 de marzo de 2016, 17:46, Francisco Javier <iterador10 en hotmail.com> escribió:> > En primer lugar, muchas gracias a Carlos, Javier Rubén y Olivier por > vuestras respuestas. > > Carlos: Logro egectivamente el gráfico que me adjuntas cuando aplico tu > código. Lo que sucede es que me doy cuenta de que con loess no consigo > ningún suavizado, pues únicamente tengo los puntos de cada sujeto unidos > mediante líneas. Así, el siguiente código me proporciona el mismo resultado > que con el loess: > > plot(df$x, df$y, xlab = "time", ylab="value", type="n") > for(i in unique(df$id)) { > lines((df$y[df$id == i] ~ df$x[df$id == i]), col = df$id) } # > Grafico simplemente las líneas > points(x = df$x, y = df$y, pch=16, col = df$id) > title("Scatter Plot of value vs. time") > > Lo que se más se asemejaría a la solución que busco es la propuesta de > Olivier, salvo por dos aspectos: Dicha propuesta exige recurrir al uso de > la librería ggplot2 y además impone que el suavizado pase por los puntos > originales, lo cual es algo que no necesariamente quiero imponer. > > Finalmente, atendiendo a lo que me dice Javier Rubén, he pensado en cargar > la librería splines y aplicar: > > plot(df$x, df$y, xlab = "time", ylab="value", type="n") > for(i in unique(df$id)) { > lines((df$y[df$id == i] ~ bs(df$x[df$id == i]), col = df$id)) } # > Intento aplicar un ajuste B-spline a cada individuo con la función bs > points(x = df$x, y = df$y, pch=16, col = df$id) > title("Scatter Plot of value vs. time") > > Pero no obtengo resultado. Quizás me estoy preguntando por algo que no se > puede hacer en R, pero en cualquier caso muchas gracias por vuestras > sugerencias. > > Francisco javier-- Saludos, Carlos Ortega www.qualityexcellence.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160304/f0bfe00b/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 21311 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160304/f0bfe00b/attachment-0001.png>