Category: Spanish

Funciones en R (principios y fundamentos)

Finalmente, y después de varios intentos (entre ocupaciones y pereza) logré
escribir otra vez un nuevo post para mi “R para Chibchombianos”.
Entre otras cosas, ahora que lo pienso es hasta liberador escribir aquí porque
no me tengo que preocupar por las formas, las criticas o los estilos y si puedo
seguir mis propios caminos y entregar lo que quiero dar y como quiero hacerlo,
que es el fin ultimo del blog 😀 (gracias por leer, a quien lo haga!)

Como lo había prometido, tenla desde hace rato pensado escribir (empezar a escribir)
sobre funciones y programación en R…Para el inicio decidí entonces realizar este post
acerca de las cosas necesarias/obligatorias que se deben saber antes de entrar de lleno
a funciones, paquetes, lenguaje y demás, para esto he escogido algunos temas de interés,
espero les guste, aprendan y lo disfruten.

**Modo de Batch

R tiene dos modos de trabajo básicos (Interactivo y Batch) sin contar programas de manejo
como Rstudio; el modo interactivo es el que conocemos
cuando iniciamos una sesión de R en windows, este modo es el más “amigable” para los usuarios
nuevos, pero para objetivos de programación es altamente disfuncional y lento.

El modo Batch por el contrario, se encarga de automatizar sesiones en R, correr scripts
y ser flexible a nuestras necesidades, sin necesidad de abrir R y seguir POR PASOS y manualmente
una serie de comandos para obtener un producto final.
Lo que se debe hacer entonces, es poner el código de nuestro análisis o función dentro de
un archivo que la mayoría de veces termina en .R (recomendable), aunque puede ser un .txt,
entre otros.

Por ejemplo, creamos un archivo de texto llamado “yayirobe.R” que contenga lo siguiente:

————————————————————————————
pdf(“prueba_hist.pdf”) # Doy un nombre al archivo que contendrá el “output” en .pdf
hist(rnorm(200)) # Genero 200 números y hago un histograma con ellos
dev.off() # Cierro el archivo que contiene el histograma
————————————————————————————
Todo lo que esta después de # (numeral) en cada linea de comandos del archivo son comentarios
y estos serán ignorados por el interprete de R, estos comentarios sirven para recordarnos
que es lo que estamos haciendo con cada linea de comandos. (solo se ejecutara en R lo que esta
antes del # en cada linea.
Con el modo Batch, es posible ejecutar cientos o miles de ordenes y lineas en R de modo automático
y rápido, en este caso solo ejecutamos tres lineas de comandos para generar un histograma.
Específicamente:

1. pdf(“prueba_hist.pdf”) —>llamamos la función pdf para decirle a R que queremos guardar
el gráfico en un archivo llamado “prueba_hist.pdf”

2. hist(rnorm(200)) —>genero 200 números al azar que tienen distribución normal, con
rnorm(random normal) que van de 0 a 1, y hago un histograma con estos números utilizando la función hist

3. dev.off()  —>cierro la ventana o “device” en el que se escribirá el histograma al archivo
que nombramos anteriormente (prueba_hist.pdf), y el archivo se escribe en el directorio en el cual
estemos trabajando.

Finalmente se puede ejecutar este archivo (yayirobe.R) para obtener el pdf con el histograma,
de dos formas. En windows, abriendo R y dándole click en las pestañas superiores y escogiendo el archivo.

En linux, como me parece mejor, no hay necesidad de abrir R y se puede ejecutar el archivo
directamente desde la consola (konsole) del sistema con el comando:

$ R CMD BATCH yayirobe.R

**Introducciòn a funciones en R

Una función es un grupo de instrucciones que toma un “input” o datos de entrada, usa estos datos
para computar otros valores y retorna un resultado/producto.
Para empezar con un pequeño ejemplo, definiremos dos funciones con las cuales se puedan calcular
el porcentaje de  purinas y pirimidinas en una secuencia de ADN.
Llamaremos al archivo que contiene las funciones “puripiri.R” :
————————————————————————————
# calcular el porcentaje de purinas y pirimidinas en una secuencia de ADN
Purinas<-function(x) {
    Purinas <- 0 # asignar 0 a Purinas
    for (n in x) {
        if (n == “A”) Purinas <- Purinas + 1 # contar las purinas
        if (n == “G”) Purinas <- Purinas + 1 # contar las purinas
    }
    return((Purinas/(length(x)))*100)
}

Pirimidinas<-function(x) {
    Pirimidinas <- 0 # asignar el valor de 100 a Pirimidinas
    {
        Pirimidinas <- 100-Purinas(x)
    }
    return(Pirimidinas)
}                       
#> Pirimidinas(c(“A”,”T”,”T”,”G”,”G”,”G”))
#[1] 33.33333
#> Purinas(c(“A”,”T”,”T”,”G”,”G”,”G”))
#[1] 66.66667
#> Purinas(c(“A”))
#[1] 100
#> Pirimidinas(c(“A”))
#[1] 0
————————————————————————————
Todas las lineas que se encuentran después de un # son comentarios que se agregan al
código de la función. En este caso el primer comentario menciona lo que hacen las funciones
que se van a escribir.
Primero se define la primer función y se le da el nombre que se desee y que se aplicara al objeto x (x), para nuestro caso
el nombre es “purinas” y continuación se empieza a escribir el cuerpo de la función y se escribe después de haber abierto un corchete ({) :

Purinas<-function(x) { 

Le asignamos un valor de 0 (para empezar) al porcentaje de purinas en la secuencia, y a partir
dse este valor empezaremos a hacer el conteo de las purinas para cada base en la secuencia:

Purinas <- 0 # asignar 0 a Purinas

Ahora le decimos que para cada elemento n del objeto x , en este caso la secuencia de ADN, se le aplicara
el resto de el código de la función, en pocas palabras, abrimos un loop:

for (n in x) {

A continuación le decimos lo que debe hacer con cada elemento n del objeto x, cada vez que lo evalué.
Para nuestro caso seria: si (if) el objeto(n) que encuentra en la secuencia(x) es “A” o “G”, entonces le sume
1 a Purinas, que antes habíamos asignado un valor de 0; Que pase al siguiente elemento(n) de la secuencia(x)
y que vuelva a hacer lo mismo:

if (n == “A”) Purinas <- Purinas + 1 # contar las purinas
if (n == “G”) Purinas <- Purinas + 1 # contar las purinas

Finalmente le decimos que cierre la parte de operaciones de la función con el corchete (}) y que lo ue la función nos
debe arrojar (return) es el valor del ((número de las bases que sean Purinas, sobre la longitud (length) de la secuencia(x), es decir, el
length(x) es el mismo número de elementos(n) de x), multiplicado x 100).
En pocas palabras, le decimos que nos arroje como resultado de la función el porcentaje de bases purinicas que se encuentran en la secuencia de
ADN:

 }
    return((Purinas/(length(x)))*100)
}

De este modo, cerramos el cuerpo y terminamos de escribir, nuestra primer función.
Y empezamos a escribir la segunda función, a la que llamaremos “Pirimidinas”:

Pirimidinas<-function(x) {

Al igual que como lo hicimos con la primer funciòn, asignamos una variable llamada Pirimidinas
con el valor inicial de 0:

Pirimidinas <- 0 # asignar el valor de 100 a Pirimidinas

Lo siguiente es algo muy importante en R, y es el hecho de que se puede llamar una función dentro de otra función,
en nuestro caso llamaremos la función “Purinas” (previamente creada) y a 100 le restaremos el valor de el resultado de
la función “Purinas” de una secuencia de ADN (x), puesto que el resto de las bases de las secuencias que no son
Purinas, deben explicitamente ser Pirimidinas y como es un porcentaje, el porcentaje de Pirimidinas será 100  menos el
porcentaje de Purinas que ya calculamos previamente:

    {
        Pirimidinas <- 100-Purinas(x)
    }

Finalmente lo que hacemos es decirle a R que nos arroje el resultado de la resta anterior, que es el resultado del porcentaje
de Pirimidinas en la secuencia de ADN:

    return(Pirimidinas)

Para finalizar lo que se ponen, son ejemplos de casos en los que se prueba o se utiliza la función, de tal forma que nos aseguremos
de que las dos funciones esta escritas y definidas correctamente, estos ejemplos, se escriben en forma de comentarios precedidos por
el símbolo de numeral #:

#> Pirimidinas(c(“A”,”T”,”T”,”G”,”G”,”G”))
#[1] 33.33333
#> Purinas(c(“A”,”T”,”T”,”G”,”G”,”G”))
#[1] 66.66667
#> Purinas(c(“A”))
#[1] 100
#> Pirimidinas(c(“A”))
#[1] 0

**Variable Scope

Una variable/objeto que se crea dentro de una función, es llamada una variable local, puesto que es temporal y solo se utiliza
dentro de la función, mientras se efectúan los cálculos u operaciones, y una vez obtenido el resultado esta variable es eliminada.
En nuestra función de ejemplo las variables “Purinas” y “Pirimidinas” a las que les asignamos 0 inicialmente, al igual que la variable
n, son variables locales.

De tal modo que cuando llamemos a “n” por fuera de la función, en la consola de R, nos dira
que el objeto ‘n’ no existe y que no lo encuentra.
y si llamo a “Pirimidinas” en la consola de R, el me dirá que Pirimidinas es una función que llame con ese nombre
, pero no me lo reconoce como una variable por fuera de la función:
————————————————————————————
> Pirimidinas(c(“A”,”T”,”T”,”G”,”G”,”G”))
[1] 33.33333
> n
Error: object ‘n’ not found
> Pirimidinas
function(x) {
    Pirimidinas <- 0 # asignar el valor de 100 a Pirimidinas
{
    Pirimidinas <- 100-Purinas(x)
}
    return(Pirimidinas)
}
> care_perro <- 08071988
————————————————————————————
De manera que se pueden definir variables locales dentro de funciones, que tengan los mismos nombres de variables
globales por fuera de la función o inclusive con el mismo nombre de la función, y R no se confundirá y mantendrá ambas variables
como separadas.
Y finalmente la variable “care_perro” es una variable global que creamos por fuera de una función y que contiene el número
08071988 .

**Argumentos por defecto

Consideremos la función:

> firulallo <- function(x,y=5,z=F) { … }

Esta función la llamamos “firulallo” y “no tiene cuerpo”, puesto que dejamos abierto o vacía la definición de la función per se con los corchetes
y los tres puntos, ( { … } ).
Mientras tanto, lo que si definimos son argumentos que se ejecutaran por defecto, siempre y cuando el usuario no cambie el argumento o lo re-defina,
es decir, para y definimos un valor de 5 y para z, que es una variable lógica la definimos como FALSE o F;
de tal forma que si ejecutamos la función sin cambiar los argumentos por defecto, R utilizará los que definimos al escribir la función.

Para un objeto x, con valor a 100, utilizando los argumentos por defecto:

>firulallo(100)

Para un objeto x, con valor de 100, cambiando los argumentos por defecto:

>firulallo(100, y=60, Z=TRUE)

Para un objeto x, con valor de 126, cambiando solo un argumento por defecto (el otro argumento, el que no cambiemos, se ejecutara por defecto):

>firulallo(126, y=45)

ESO ES TODO POR AHORA Y ESPERO PRONTO PODER COMPARTIR MÁS COSAS Y QUE LES HAYA GUSTADO Y LES PAREZCA MUCHO MÁS FÁCIL AHORA!

"áRboles de compRomiso pondeRado": un método paRa ResumiR difeRentes hipótesis filogenéticas en R.

El 9 de Octubre de 2012, la revista Cladistics, publico en la web a manera de “Early view” un artículo, acerca de un nuevo método de consenso, para resumir distintas hipótesis/árboles/topologias resultantes de un análisis filogenético.
El titulo en ingles del articulo es Weighted compromise trees: a method to summarize competing phylogenetic hypotheses,  y sus autores son Michael J. Sharkey, Stephanie Stoelb, Daniel R. Miranda-Esquivel  y Barabara J. Sharanowski.


Nota_1:Realmente no estoy muy seguro de la “traducción” del nombre del método que puse en el titulo de este post, pero fue el que me pareció que se acercaba más.

Básicamente, como lo dicen en el resumen, el método corrige un “sesgo” inherente al método de consenso de la mayoría, cuando los árboles iniciales son dependientes (no muestran independencia) debido a la ambigüedad en sus clados terminales.

Nota_2: como es característica en R para Chibchombianos, el fin ultimo del blog es la implementación de análisis en R, más no la explicación de los métodos que utilizamos, en orden de promover el uso de R. Si alguien quiere instruirse más acerca de este nuevo método de consenso, puede consultar directamente  el artículo, que es de tan solo 5 paginas y es muy fácil de entender. 

Acompañado con el artículo, D.R. Miranda, escribió una función para la implementación del nuevo método, utilizando el paquete “ape” en R, el código puede ser descargado desde Google code/Wconsensus, y para utilizarlo solo tenemos que descargar el archivo “wconsensus.R”, que es la extensión que contiene el código de la función. (en la lista de descargas, también esta disponible un archivo comprimido, que contiene algunos archivos de ejemplo y explicación para utilizar la función)

Para explicar como utilizar la función se debe construir un archivo con extensión .tre , que contenga los árboles iniciales para realizar el consenso, en nuestro ejemplo utilizaremos 5 árboles iniciales, teniendo como terminales a las tortugas ninjas y su maestro 😛 (que hago? crecí con las tortugas ninjas!! y los Motorratones)

el archivo debe lucir así, y debe ser guardado como “tortugas.tre”:


>setwd("~/Escritorio")
#Escojo el directorio en el que esta mi archivo (tortugas.tre) con los árboles iniciales y el archivo de la función (wconsensus.R).

> source("wconsensus.R")
#Cargo la función a mi
área de trabajo.

> tortugas <-read.tree("tortugas.tre")

#Leo el archivo de árboles iniciales.


> plot(tortugas)

#Grafíco (opcional/si quiero ver los árboles!) los árboles iniciales.





> consenso_tortugas <- wconsensus(tortugas, collapse= TRUE, cutvalue =0.65)#Realizo el consenso, con un valor de corte de 0.65 para colapsar nodos.
> summary(consenso_tortugas)
#Reviso el valor y número de nodos y las
estadísticos
del consenso.

Phylogenetic tree: consenso_tortugas

Number of tips: 5
Number of nodes: 4
Branch lengths:
mean: 0.8888889
variance: 0.02469136
distribution summary:
Min. 1st Qu. Median 3rd Qu. Max.
0.6667 0.7500 1.0000 1.0000 1.0000
No root edge.
Tip labels: Leonardo
Miguel_angel
Rafael
Donatelo
Splinter
Node labels: 1
0.6667
0.7778
0.6667


> plot(consenso_tortugas)
#Grafíco el árbol consenso

Árbol consenso con un nivel de corte de 0.7 (cutvalue=0.7)

Árbol consenso con un nivel de corte de 0.8 (cutvalue=0.8)

En el próximo post, para ir entrando a lenguaje de programación de manera "suuuaaave", exploraremos un poco, la manera en la que fue escrita esta función de consenso y su código. Hasta entonces!! Buena eneRgía!! Y como dirían los chicos que tengo como portada del blog (Martin de Francisco y Santiago Maure): "Que se los coma el vejete del Jaime Barón"


Introducción al programa estadístico R: el niño (yo) ya aprendió a sentarse en la vasenilla!!! :P

Dandome “contentillo” y justificando mi pereza, he de contarles que estos 5 meses no fueron del todo vanos, y no abandone completamente mi fiel y mas que justa causa, al difundir y vender R como un buen amante…para los solitarios habidos de software libre y sencillo.
Así pues, durante el ” II Seminario de Biodiversidad y Conservación de Especies amenazadas, humedales, ecosistemas críticos”, organizado por el “Grupo de Investigación y Estudios en Ciencias Biológicas” (Con el cual estoy muy agradecido, especialmente con Fernando Cediel, quien tuvo la “loca e irracional” idea de invitarme y con Natalia Rey, quien estuvo por ahí pendiente de los materiales necesarios para el curso (incluido el refrigerio! 😛 )) , tuve la oportunidad de dictar mi primer curso de manejo y estadística básica en R.
El curso tuvo una duración de 3 días (5, 6 y 7 de Septiembre, 2 horas cada día) y una asistencia de aproximadamente 28 estudiantes de distintos lugares del país;  En un principio estuve un poquitin asustado con la idea, pero por la gracia de la buena onda, todo salio muy bien!
Gran parte del material que utilice en el curso provino de “R para Chibchombianos”, y otra parte es complementaria a cabos que tenia sueltos (por ejemplo, la terminación de los post de exploración de los datos, previa a un análisis estadístico, basado en el articulo de Alain Zuur y colaboradores), para de esta forma reunir toda la información mostrada en el blog y otra adicional, compilada en un solo lugar.

De este modo, en este post, quiero compartirles via Google Docs (POR CIERTO, VIVA GOOGLE DOCS!!) todas las diapositivas que utilice en el curso, con comandos, información y todo el resto de cosas adicionales.
Las diapositivas contienen aveces imágenes escogidas por mi, de pintores que me gustan y fotógrafos  que me gusta poner para hacer las presentaciones mas “firmes” y para compartir Arte, Ciencia, Software y vida juntos!!
La presentación esta organizada de la siguiente manera:

*Primer día: INTRODUCCIÓN AL PROGRAMA ESTADÍSTICO R
     -Presentación
     -Instalación de R
     -Paquetes
     -Repositorios
     -Argumentos y comandos
     -Objetos
     -Vectores
     -Matrices
     -Arrays
     -Data Frames
     -Listas
     -Factores
     -Entrada y manejo de datos (incluido desde excel)
     -Exportando datos y gráficos desde R

*Segundo día: ESTADÍSTICA DESCRIPTIVA Y UNIVARIADA EN R
     -Frecuencias e Histogramas
     -Tendencia central
     -Normalidad
     -Homogeneidad de varianzas
     -Outliers
     -Mas exploración de datos (recomendadisimo!!)
     -T y T pareada
     -U y U pareada
     -Chi cuadrado
     -Test de proporciones
     -Anova de un factor
   
*Tercer día: ESTADÍSTICA MULTIVARIADA EN R
     -Anova de dos factores
     -Manova
     -Kruskal-Wallis & “adonis”
     -Clusters (bastante de esto!)
     -Análisis discriminante
     -Análisis de correspondencia canónica 
     -Componentes principales (PCA)
     -Escalamiento multidimensional simple
     -Perspectivas y ejercicios de R

ESPERO LES SEA DE GRAN AYUDA ESTAS DIAPOSITIVAS, EN ESPECIAL PARA MUCHAS COSAS QUE AÚN NO HABÍA COMPARTIDO CON UDS.
TODAVÍA NO SE SI ALCANCE A HACER EL ULTIMO POST DEL AÑO O SI ME TOCA QUEDÁRSELOS DEBIENDO PARA EL OTRO AÑO!
DE TODOS MODOS Y POR SI LOS TABANOS (LAS MOSCAS), LES AGRADEZCO MUCHO A LOS SEGUIDORES DEL POST, A LAS PERSONAS QUE ME LEEN POR AHÍ Y ESPERO QUE EL OTRO AÑO SEA REALMENTE PRODUCTIVO PARA TODOS EN CONJUNTO Y EN EN INDIVIDUAL!!

El futuro próximo y/o lejano de R para Chibchombianos, después de dos años de cambiar pañales!

Después de 5 meses de inactividad en el blog, vuelve “R para Chibchombianos” la semana próxima con la intención de finalizar un ciclo que desde hace rato estaba sin concluir (me refiero al manejo básico de R,  fundamentos de estadística descriptiva, univariada y multivariada).
Esto simplemente con la intención de dejar atrás el manejo básico de R, para adentrarnos en temas un poco mas avanzados, ya que el próximo 16 de Diciembre el blog cumplirá dos años de haberse creado y creo que el primer objetivo que era el entendimiento de las cosas básicas de R esta completo (o por lo menos lo estará la próxima semana).
Seguramente muchas cosas habrán hecho falta, pero siento que es imposible llegar a cubrirlas todas, solo espero que haya sido de gran ayuda el blog para las personas que no tenían ni idea de las ventajas de utilizar R y que haya sido una muy buena y muy fácil forma de empezar a entender R.
Que vendrá para la posteridad?
Bien, habiendo completado esta parte, creo que ahora me dedicare a lo mio y empezare a abordar cosas mas avanzadas, tanto para Biología en particular como para el publico en general:

-Ecología
-Sistemática Filogenética y taxonomía
-Manejo de datos geográficos
-Morfometría geométrica !!!!
-modelos estadísticos en general y ecológicos
-Estadística no-frecuentista
-funciones, código y lenguaje de programación !!!!

La transición hacia estos nuevos objetivos del blog  sera muy divertida y en ocasiones también sera un poquito tediosa, sobre todo lo relacionado con programación (puesto que es de lo que menos se), pero sera quizás una muy buena forma de aprender muchas cosas juntos.

Espero que en los años venideros sea muy productivo el blog (mas de lo que pudo ser estos dos primeros años) y que les guste todas las cosas que van a ver.

NO OLVIDEN LA PRÓXIMA SEMANA “OJEAR” EL ULTIMO POST DE ESTE PRIMER CICLO, SERÁ INTERESANTE (BUENO, ESO LO DIRÁN USTEDES, PARA MI LO ES!), MUY CONCISO Y CONTENDRÁ MUCHA INFORMACIÓN (YA DISPONIBLE EN EL BLOG Y NUEVA INFORMACIÓN)  EN UN ESPACIO REDUCIDO, A MANERA DE RESUMEN DE TODA LA PRIMER PARTE DE “R PARA CHIBCHOMBIANOS”!!

“firme”-mente

BROSSY