martes, 24 de diciembre de 2013

Feliz Navidad en R

¡Feliz navidad 2013!


Por cierto, el árbol de navidad de arriba fue generado mediante el siguiente código en R:


parte <- list(x0=0,y0=0,x1=0,y1=1,
    rama1=NULL,rama2=NULL,extension=NULL,
    lwd=1,nivel=0,col="darkgreen")

par(mfrow=c(1,1),mar=c(5, 4, 4, 2) + 0.1)
segplot <- function(arbol) {
  if (is.null(arbol)) return()
  segments(arbol\(\$\)x0,arbol\(\$\)y0,arbol\(\$\)x1,arbol\(\$\)y1,
      col=arbol\(\$\)col,
      lwd=arbol\(\$\)lwd)
  segplot(arbol\(\$\)rama1)
  segplot(arbol\(\$\)rama2)
  segplot(arbol\(\$\)extension)
}

crear_adornos <- function(arbol) {
  if (is.null(arbol)) return()
  padorno <- 0.002*(arbol\(\$\)x1)^2*abs(arbol\(\$\)y1)^2.5
  adorno <- sample(c(T,F),size=1,prob=c(padorno,1-padorno))
  cadorno <- sample(c("darkred","darkgoldenrod4"),size=1,prob=c(0.6,0.4))
  if (adorno)
    adornos <<- rbind(adornos,data.frame(x=arbol\(\$\)x1,y=arbol\(\$\)y1,color=cadorno))
  crear_adornos(arbol\(\$\)rama1)
  crear_adornos(arbol\(\$\)rama2)
  crear_adornos(arbol\(\$\)extension)
}

crear_luces1 <- function(arbol) {
  if (is.null(arbol)) return()
  padorno <- 0.003*(arbol\(\$\)x1)^2*abs(arbol\(\$\)y1)^2
  adorno <- sample(c(T,F),size=1,prob=c(padorno,1-padorno))
  if (adorno)
luces1 <<- rbind(luces1,data.frame(x=arbol\(\$\)x1,y=arbol\(\$\)y1))
  crear_luces1(arbol\(\$\)rama1)
  crear_luces1(arbol\(\$\)rama2)
  crear_luces1(arbol\(\$\)extension)
}

crear_luces2 <- function(arbol) {
  if (is.null(arbol)) return()
  padorno <- 0.003*(arbol\(\$\)x1)^2*abs(arbol\(\$\)y1)^2
  adorno <- sample(c(T,F),size=1,prob=c(padorno,1-padorno))
  if (adorno)
luces2 <<- rbind(luces2,data.frame(x=arbol\(\$\)x1,y=arbol\(\$\)y1))
  crear_luces2(arbol\(\$\)rama1)
  crear_luces2(arbol\(\$\)rama2)
  crear_luces2(arbol\(\$\)extension)
}

crece <- function(arbol) {
  if (is.null(arbol) ) return(NULL)

  arbol\(\$\)lwd=arbol\(\$\)lwd*1.2

  if (arbol\(\$\)lwd>2.5) arbol\(\$\)col <- "brown"
  if (is.null(arbol\(\$\)extension)) {
    arbol\(\$\)extension <- list(
        x0=arbol\(\$\)x1,
        y0=arbol\(\$\)y1,
        x1=rnorm(1,1,.03)*(2*arbol\(\$\)x1-arbol\(\$\)x0),
        y1=(rnorm(1,.98,.02)+.02*(arbol\(\$\)x1==arbol\(\$\)x0))*(2*arbol\(\$\)y1-arbol\(\$\)y0),
        rama1=NULL,
        rama2=NULL,
        extension=NULL,
        lwd=1,
        nivel=arbol\(\$\)nivel-0.25,
        col=arbol\(\$\)col
    )
    largo=sqrt((arbol\(\$\)x1-arbol\(\$\)x0)^2 + (arbol\(\$\)y1-arbol\(\$\)y0)^2)
    angle <- asin((arbol\(\$\)x1-arbol\(\$\)x0)/largo)
    rama <- list(
        x0=(arbol\(\$\)x1+arbol\(\$\)x0)/2,
        y0=(arbol\(\$\)y1+arbol\(\$\)y0)/2,
        rama1=NULL,
        rama2=NULL,
        extension=NULL,
        lwd=1,
        nivel=arbol\(\$\)nivel-0.25,
        col=arbol\(\$\)col
    )
    shift <- rnorm(2,.5,.1)
    rama\(\$\)x0 <- shift[1]*arbol\(\$\)x1+(1-shift[1])*arbol\(\$\)x0
    rama\(\$\)y0 <- shift[1]*arbol\(\$\)y1+(1-shift[1])*arbol\(\$\)y0
    largo=largo*rnorm(1,.5,.05)
    co <- runif(1,.35,.45)
    rama\(\$\)x1 <- rama\(\$\)x0+sin(angle+co)*largo
    rama\(\$\)y1 <- rama\(\$\)y0+cos(angle+co)*largo
    arbol\(\$\)rama1 <- rama
    rama\(\$\)x0 <- shift[2]*arbol\(\$\)x1+(1-shift[2])*arbol\(\$\)x0
    rama\(\$\)y0 <- shift[2]*arbol\(\$\)y1+(1-shift[2])*arbol\(\$\)y0
    co <- runif(1,.35,.45)
    rama\(\$\)x1 <- rama\(\$\)x0+sin(angle-co)*largo
    rama\(\$\)y1 <- rama\(\$\)y0+cos(angle-co)*largo
    arbol\(\$\)rama2 <- rama 
  } else {
    arbol\(\$\)rama1 <- crece(arbol\(\$\)rama1)
    arbol\(\$\)rama2 <- crece(arbol\(\$\)rama2)
    arbol\(\$\)extension <- crece(arbol\(\$\)extension)
  }
  arbol\(\$\)nivel <- arbol\(\$\)nivel+1
  if (arbol\(\$\)nivel>6)  arbol\(\$\)col <- "brown"

  arbol
}
arbol <- parte
for (i in 1:9) arbol <- crece(arbol)
png("arbol%02d.png")
par(mar=c(0,0,0,0))
plot(x=c(-3,3),y=c(0,9),type="n",axes=FALSE,xlab="",ylab="")
pd<-par("usr")
rect(pd[1],pd[3],pd[2],pd[4],col="black")
adornos <- data.frame(x=numeric(0),y=numeric(0),color=character(0))
crear_adornos(arbol)
luces1 <- data.frame(x=numeric(0),y=numeric(0))
crear_luces1(arbol)
luces2 <- data.frame(x=numeric(0),y=numeric(0))
crear_luces2(arbol)
#dibuja el arbol sin las luces
segplot(arbol)
with(adornos,{points(x=x,y=y,pch=19,cex=1.5,col=as.character(color))})
#dibuja el arbol con las luces1
plot(x=c(-3,3),y=c(0,9),type="n",axes=FALSE,xlab="",ylab="")
pd<-par("usr")
rect(pd[1],pd[3],pd[2],pd[4],col="black")
segplot(arbol)
with(adornos,{points(x=x,y=y,pch=19,cex=1.5,col=as.character(color))})
with(luces1,{points(x=x,y=y,pch="+",cex=0.8,col="white")})
#dibuja el arbol con las luces2
plot(x=c(-3,3),y=c(0,9),type="n",axes=FALSE,xlab="",ylab="")
pd<-par("usr")
rect(pd[1],pd[3],pd[2],pd[4],col="black")
segplot(arbol)
with(adornos,{points(x=x,y=y,pch=19,cex=1.5,col=as.character(color))})
with(luces2,{points(x=x,y=y,pch="+",cex=0.8,col="yellow")})
#dibuja el arbol con todas las luces
plot(x=c(-3,3),y=c(0,9),type="n",axes=FALSE,xlab="",ylab="")
pd<-par("usr")
rect(pd[1],pd[3],pd[2],pd[4],col="black")
segplot(arbol)
with(adornos,{points(x=x,y=y,pch=19,cex=1.5,col=as.character(color))})
with(luces1,{points(x=x,y=y,pch="+",cex=0.8,col="white")})
with(luces2,{points(x=x,y=y,pch="+",cex=0.8,col="yellow")})
#fin
graphics.off()

El código no es enteramente mio. La rutina para crear el arbol fue tomada de http://www.r-bloggers.com/merry-christmas-2/ . El código para crear las lucecitas y los adornos si es mio.

Si te gustó o te pareció útil este contenido, compártelo en las redes sociales y dale tu voto positivo en el botón "me gusta" de G+, para que otros puedan encontrar el contenido también.

domingo, 24 de noviembre de 2013

Trabajo Práctico de Estadística 2013-2 - Bibliografía

En el trabajo práctico de estadística de este semestre (2013-2) se estudia una data relativa a la ceba de la cachama blanca. A tal fín incluyo algunas referencias bibliográficas al final de esta entrada.  Si alguien ha encontrado algunos recursos bibliográficos de interés, por favor indíquelos en los comentarios de esta entrada del blog.

Quisiera sugerirles que para la discusión/interpretación de los resultados tomen en cuenta la información básica sobre la piscicultura, que debe incluirse en el marco teorico de este informe.  La discusión/interpretación de los resultados es eso, no una mera repetición de los resultados. Por ejemplo, la moda de la variable X8 para datos sin agrupar es de 84,04, tal como lo reflejan en alguna tabla de los resultados. ¿Para qué repetir esto en la discusión de los resultados? Más bien, interpreten los resultados a la luz de los procedimientos y técnicas de este cultivo. Por ejemplo, ¿está la temperatura del agua o el Ph dentro del rango sugerido para el cultivo de la cachama blanca? Existe una regla para el suministro de alimento en la cual se toma en cuenta el cálculo de la biomasa (Número de alevines por peso promedio). ¿Concuerdan los datos con esta regla? Seguramente si leen un poco sobre el cultivo de la cachama, encontraran muchos otros elementos que les ayudarán a plantear una buena interpretación de los resultados.

Por último, les recuerdo que "Discusión de los resultados" no es lo mismo que "Conclusión". Básicamente, en la Conclusión ya no van a hacer referencia al cultivo de la cachama. Para más información ver este enlace en mi blog viejo.


Bibliografía

  • TORRES, E. (2010). MANUAL DE PISCICULTURA DE AGUAS DULCES. Disponible en: http://www.alevinos-acuicultura.com/Portals/1/Manual%20Piscicultura%20Clientes.pdf .
  • PEÑUELA-HERNANDEZ, Z., HERNÁNDEZ-AREVALO, G. , CORREDOR MATUS J. R., CRUZ-CASALLAS P. E.  (2007). Consumo de oxígeno en cachama blanca (Piaractus brachypomus) durante diferentes etapas de desarrollo corporal. Revista ORINOQUIA - Universidad de los Llanos. Vol. 11, N° 1. Disponible en: http://www.redalyc.org/pdf/896/89611105.pdf .
  • GOMEZ-TRUJILLO, M. (2010). Manual de piscicultura para comunidades amazónicas. Instituto del Bien Común. Lima. Disponible en: http://www.sisman.utm.edu.ec/libros/FACULTAD%20DE%20CIENCIAS%20VETERINARIAS/CARRERA%20DE%20INGENIER%C3%8DA%20EN%20ACUICULTURA%20Y%20PESQUER%C3%8DAS/LIBROS%201/manual%20pisicultura.pdf.

Si te gustó o te pareció útil este contenido, compártelo en las redes sociales y dale tu voto positivo en el botón "me gusta" de G+, para que otros puedan encontrar el contenido también.

martes, 19 de noviembre de 2013

Estudio de estadística descriptiva en R /estUNA - video Tutorial

Video-tutorial sobre cómo utilizar el lenguaje R y la librería estUNA para realizar análisis exploratorio de datos como los que se piden en los trabajos prácticos de Estadística General (745):

Si te gustó o te pareció útil este contenido, compártelo en las redes sociales y dale tu voto positivo en el botón "me gusta" de G+, para que otros puedan encontrar el contenido también.

lunes, 4 de noviembre de 2013

Video tutorial sobre cómo instalar R

A continuación un breve video tutorial sobre como descargar e instalar R, usar R desde un RWeb server y descargar la librería estUNA. Para descargar el programa de instalación de R, debe navegar al sitio cran.


Si te gustó o te pareció útil este contenido, compártelo en las redes sociales y dale tu voto positivo en el botón "me gusta" de G+, para que otros puedan encontrar el contenido también.

jueves, 3 de octubre de 2013

Trabajos de Estadística para el 2013-2

Ya están disponibles los enunciados para los trabajos prácticos de estadística del semestre 2013-2, elaborados por Nivel Central.  Los enlaces se dan a continuación (según http://areamatematicas.galeon.com/):

Sobre las fechas de entrega, se ha escrito en los enunciados lo siguiente:

La evaluación del trabajo comprende dos entregas obligatorias:
  • 1era Entrega: primera versión del informe final entre el 09/11/2013 y el 16/11/2013, en esta oportunidad el trabajo será revisado por el asesor y el participante debe registrar las observaciones pertinentes a fin de realizar las correcciones, pues el trabajo lo retiene el asesor hasta la entrega final con el objeto de verificar que las correcciones fueron realizadas.
  • 2da Entrega: Versión final del trabajo entre el 11/01/2014 y el 18/01/2014 improrrogable. De no respetar las dos entregas en los lapsos correspondientes queda a discreción del asesor considerar reprobado el trabajo.
 Nota: Me pueden enviar los trabajos (borrador y versión final) en formato Word 2003 o preferiblemente en Libre Office a mi correo: jlaurentum@gmail.com. Por favor no enviar en formato Word 2007 o posterior (extensión de archivo .docx). Ni siquiera abriré el archivo si se encuentra en este formato.

Si te gustó o te pareció útil este contenido, compártelo en las redes sociales y dale tu voto positivo en el botón "me gusta" de G+, para que otros puedan encontrar el contenido también.

lunes, 9 de septiembre de 2013

Modelado con Parabolas y Catenarias

Si tomamos una cadena o una cuerda por sus dos extremos, sin tensarla, y la sometemos a un campo gravitatorio uniforme podremos ver que se deforma describiendo una curva.  Esta curva es semejante a una parábola convexa y de hecho, el gran Galileo Galilei pensaba que la forma descrita por una cadena suspendida como se describe arriba era una parábola.  Poco menos de medio siglo después,  Johann Bernoulli, Christiaan Huygens y Gottfried Leibniz dedujeron la ecuación de esta forma, a la cual llamaron "catenaria", palabra que proviene del latín catena, que significa cadena.  La ecuación de la catenaria contiene un parámetro que permite obtener "curvas colgantes" más o menos estiradas entre los dos puntos extremos desde donde se cuelga la cadena:

\[
y=a\cdot\frac{e^{\tfrac{x}{a}}+e^{-\tfrac{x}{a}}}{2}
\]

Es fácil entender porqué Galileo se equivocó.  Después de todo, las catenarias y las parábolas se parecen mucho.  La deducción de la ecuación de la catenaria proviene de considerar tres fuerzas en equilibrio que actúan sobre cada punto de la cadena suspendida: las tensiones laterales en virtud de las cuales la cadena se mantiene unida y la fuerza gravitatoria hacia abajo.

En lo que sigue intento hacer un poco de "matemática experimental" trabajando con fotos con curvas catenarias para ajustarlas a curvas cuadráticas.  Por ejemplo, el parapente en vuelo parece describir una parábola:






Sin embargo, si seleccionamos algunos puntos de la curva para luego ajustarlos a una función cuadrática, obtenemos la siguiente curva parabólica:


La curvatura del parapente en realidad describe una catenaria. Obsérvese que la parábola ajustada es un poco más "puntiaguda" en el centro, mientras que la curva catenaria del parapente es algo más aplanada en esta región.  Esto es una diferencia característica entre las catenarias y las parábolas.  Seguimos experimentando con otra curva, esta vez la curva que describen los cables de suspensión de un puente colgante, en este caso el Puente de Angostura sobre el río Orinoco:


Esta vez, el ajuste a una parábola resultó ser casi perfecto, observándose que la parábola ajustada no es más puntiaguda hacia la parte central del puente.  Esto parece algo paradójico porque las catenarias se deducen de las fuerzas/tensiones que actúan en cada punto de un cable suspendido, como el del puente.  Sin embargo, los cables suspendidos de los puentes colgantes soportan una vía casi horizontal y en este caso el peso del cable es prácticamente despreciable en comparación con el peso del puente soportado.  En este caso, los cables de soporte no están suspendidos libremente.


Les dejo a continuación el script en R para realizar el ajuste de la curva en una fotografía a una función cuadrática.  Primeramente, se hace uso de una librería llamada png (que hay que instalar mediante el comando install.packages) para colocar la foto como imagen de fondo.  Mediante la función locator, obtenemos un data frame con las coordenadas x/y de los n puntos que seleccionamos sobre la imagen (tratando de que estos puntos caigan exactamente sobre la curva).  Por último, se ajusta el modelo cuadrático y~1+x+x^2 a estos puntos mediante una regresión lineal y se gráfica la curva parabólica obtenida con estos coeficientes.

#Ajuste de los cables de suspensión del Puente de Angostura
#sobre el Río Orinoco a una parabola
#Autor: Prof. José Romero
#Fecha: 09/09/13
  library(png)
  ima <- readPNG("angostura.png")
  plot.new()
  plot.window(c(-211,211),c(-156,156))
  lim <- par()
  rasterImage(ima, lim\(\$\)usr[1], lim\(\$\)usr[3],
  lim\(\$\)usr[2], lim\(\$\)usr[4])
  axis(1)
  axis(2)
  grid()
#selecciona 9 puntos sobre el cable suspendido del puente
  datapoints <- locator(n=9,type="p")
  points(datapoints,col="red")
#ajusta a una función cuadrática
  cuadraticmodel <- lm(y~1+x+I(x^2),data=datapoints)   coefs <- as.numeric(coef(cuadraticmodel))
  a2 <- coefs[3]
  a1 <- coefs[2]
  a0 <- coefs[1]
  parabola <- function(x) return(a2*x^2 + a1*x + a0)
  curve(parabola,from=-200,to=200,col="red",add=TRUE)


Referencias



Si te gustó o te pareció útil este contenido, compártelo en las redes sociales y dale tu voto positivo en el botón "me gusta" de G+, para que otros puedan encontrar el contenido también.

sábado, 13 de julio de 2013

Anuncio de charla sobre Python


Se anuncia una charla titulada

"Hazlo tu mism@ en Python"

Sede de la UNA - Sábado 27/07/2013 - 10:30am

Para mayores detalles abra el enlace en el título.


Si te gustó o te pareció útil este contenido, compártelo en las redes sociales y dale tu voto positivo en el botón "me gusta" de G+, para que otros puedan encontrar el contenido también.