Ir al contenido

Usuario:FGSEL/Taller

De Wikipedia, la enciclopedia libre

Breve introducción a R[editar]

Clase dada por el Ing. Agr. Fabrizio García Seleme. Cátedra de Estadística y Diseño Experimental, FCA-UCC.

Aprovecho este espacio para dejarles algunas nociones básicas sobre el manejo general de R.

R es un lenguaje de programación enfocado en el análisis estadístico, contando con funciones generales y específicas para cada rama del análisis estadístico.

R se puede utilizar desde una aplicación (llamada también R, inesperado) que puede obtenerse en este link

Es un software libre y no se debe pagar absolutamente nada por su uso.

Si bien su uso actualmente está mucho (muchísimo) más difundido a través de RStudio, como las compus de la UCC no tienen esta app, usaremos R directamente.

Algunas aplicaciones relacionadas[editar]

RStudio[editar]

Aplicación más "amigable" a la vista que R, con un "copiloto" de programación que ayuda en la elaboración del código. Cuenta con un listado de las funciones disponibles y un vínculo al manual de ayuda de cada una. Posee un visor de gráficos integrado y permite listar los distintos identificadores ya utilizados.

Además tiene modo oscuro, muy apreciable luego de largas sesiones de trabajo (R también, pero es difícil de editar). Quien escribe la recomienda profundamente.

Descargable vía este link

Rtools[editar]

Aplicación secundaria de R que puede ser necesaria para instalar algunas funciones específicas. Puede ser necesaria a nivel de posgrado.

Python[editar]

Lenguaje de programación altamente difundido, utilizado a veces por R para enlazarse a otras aplicaciones

Características básicas de un lenguaje de programación[editar]

"Los lenguajes de programación están formados por un conjunto de símbolos (llamado alfabeto), reglas gramaticales (léxico/morfológicas y sintácticas) y semánticas, que en conjunto definen las estructuras válidas del lenguaje y su significado. (...) El lenguaje de programación permite especificar de manera precisa sobre qué datos debe operar un software específico, cómo deben ser almacenados o transmitidos dichos datos, y qué acciones debe tomar el software bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa."

(Artículo: Lenguaje de programación)

Así como los idiomas (llamados "lenguajes naturales") tienen símbolos, verbos y oraciones propias, cada lenguaje de programación tiene sus propias "reglas" de uso. Dentro de esas reglas, usualmente se encuentra un patrón general de conceptos.

  • Estructura general: de mayor o menor complejidad según el lenguaje y el objetivo del programa que se desee elaborar.
  • Variables: espacios reservados en la memoria que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa.
  • Constantes: su valor asignado no puede ser cambiado durante la ejecución del programa.
  • Palabras reservadas: son palabras puntuales que, dentro del ambiente de programación, tienen una función específica de la cual no se pueden despegar. El caso más común en programación es if (inglés para la conjunción "si").
  • Identificadores: secuencia de caracteres (en criollo, "nombre"), a los que se les asignó un determinado valor. Pueden ser de distinta naturaleza (vectores, tablas, números sueltos, listas, imágenes, etc). Cada lenguaje tiene una serie de restricciones para el uso de identificadores, la más común es que no pueden comenzar su nombre por un número (ej.: puedo agregar un identificador "MapaRendimiento_1", pero no "1MapaRendimiento"). En R los llamamos Objetos.
  • Comentarios: llamados en R a través del símbolo #, permiten realizar acotaciones sobre el programa. Útiles para marcar errores o anotar resultados.
  • Operadores lógicos: relacionados a, por ejemplo, control de procedimientos del programa. Vienen a representar los símbolos <, > e =, como así también otros operadores como "y", "o".
  • Operadores matemáticos: permiten realizar operaciones matemáticas en general, además de otras funciones más complejas (por ej. superponer dos gráficos).
  • Funciones: de funcionamiento similar a las fórmulas de Microsoft Excel, permiten realizar diversos análisis o modificaciones a las variables y objetos disponibles.

Usando R[editar]

R en sí al abrirse tiene una sola ventanita interna, llamada "Área de Trabajo". En ella se verán todos los resultados de las distintas cosas que nosotros le ordenemos al programa que haga. Es similar, a grandes rasgos, a una ventana de resultados.

La principal complicación del área de trabajo es que, entre todos los resultados, podemos llegar a perder de vista los comandos que utilizamos minutos atrás. Por ello, sería óptimo que hubiese un lugar donde ir escribiendo los comandos, poder ejecutarlos desde ahí y que queden guardaditos y en orden.

Bueno, eso existe, y se conoce como "Script". Se puede abrir uno ya hecho o uno vacío desde la pestaña "Archivo".

En un script se pueden alternar dos cosas, básicamente:

  • Comandos: órdenes que se le da al programa para que ejecute. Pueden ser operaciones matemáticas, lógicas, estadísticas o bien creación de objetos o gráficos.
  • Comentarios: siempre precedidos por un #, son líneas de código que el software no va a ejecutar
Este pedazo de codigo no tiene un numeral y dará error
#Este pedazo de codigo si tiene un numeral. Como R lo ve como un comentario, no dará ningún error

Notita importante: esto de arriba es un pedazo de código. Ustedes pueden copiarlo y pegarlo en un Script en sus computadoras. Para que R "corra" estos códigos, es necesario posicionarse en un renglón y apretar (conjuntamente) Ctrl+R (R en este caso proviene del inglés "run", correr).

A su vez, si seleccionan la palabra pedazo y aprietan Ctrl+R, el software correrá sólo ese fragmento del renglón, ignorando lo que no fue seleccionado.

Errores y Warnings[editar]

Es común (demasiado a veces) que al ejecutar un código algo esté mal. R nos avisa esto mediante dos tipos de mensajes:

  • ERROR: problema insalvable en el comando, que hace que el mismo sea inútil o dé un resultado altamente indeseable.
  • WARNING: problema menor en el comando, más bien un "consejo" o "sugerencia" generalmente ignorable. De hecho hay una función específica para esconder los warnings.

La interpretación de errores puede ser sencilla (falta de argumentos, no existe la función solicitada, etc) o muy compleja. Internet es un gran aliado a la hora de corregir errores, y existe una enorme comunidad de programadores y aficionados online dispuestos a asistirnos en estos problemas.

Utilización de operadores básicos[editar]

Entre tantas cosas para las que sirve R, su uso más básico es el de calculadora. Dentro de R es factible realizar cualquier tipo de operación combinada matemática, como así también ecuaciones de primer grado.

La simbología para estos casos es idéntica a la de Microsoft Excel.

#Operaciones matemáticas

2+2
2+2*3+4^2

#Ecuaciones de primer grado
x = 24^3-3700-0.25*16
x

Para el caso de las ecuaciones, notarán que al correr el renglón de la ecuación (n°7), en el área de trabajo no aparece ningún resultado. Bueno, esto es porque en realidad, el código x = 24^3-3700-0.25*16 lo que está haciendo es crear un objeto llamado 'x y asignarle el valor resultante de la ecuación. Si corremos el renglón n°8 que tiene la x sola, lo que hará R es mostrarnos cuál es el valor de ese objeto.

IMPORTANTE: R usa el punto como marcador de decimales, la coma tiene sólo una función lógica.

El símbolo = en soledad indica asignación, y es sinónimo de <- (forma que es más frecuente entre los usuarios)

Para operaciones lógicas, la situación simbólica es similar. Para los logos mayor igual/menor igual se emplea <= o >= según corresponda.

El punto más relevante en esta parte es el "igual". Como se vio antes, el símbolo = tiene la función de "asignar un valor a". Por ello, si pusiéramos sencillamente x = 10, R simplemente anotaría que el valor de x ahora es 10. Para hacer la prueba lógica, es necesario usar ==. A su vez, si se deseara utilizar el "desigual", se puede escribir !=, pues en lenguaje de R, ! implica negación. Es decir que escribir x != 10 quiere decir "x no es igual a 10".

#Operaciones lógicas
x > 10120 #devuelve FALSE
x >= 10120 #devuelve TRUE

x == 10 #devuelve FALSE
x != 10 #devuelve TRUE

Otro símbolo que puede aparecer es el denominado "pipe" (mal traducible como "conducto"), que puede aparecer como > o %>% (aunque este último funciona sólo cuando se utilizan funciones específicas).

x <- 36 |> sqrt() #Asignamos a x el valor de 36, inmediatamente le aplicamos una raíz cuadrada
x

Introducción a las funciones[editar]

El sqrt() que se ve en este fragmento puede parecer raro, pero es la abreviatura de "squared root" (raíz cuadrada en inglés). Ese sqrt es una función. R tiene cientos de funciones disponibles apenas lo abrimos, y sqrt es una de ellas. A similitud de las funciones de Excel, las funciones de R vienen con un paréntesis dentro del cual deben ingresarse los argumentos de la función (esto es, todos los detalles que le doy al programa para que haga exactamente lo que quiero).

Los argumentos pueden llegar a ser muy pocos (para sqrt es uno solo), aunque pueden llegar a ser decenas de argumentos. Nunca nadie se acordará de todos los argumentos (que, de hecho, tienen una sintaxis específica que debe respetarse para que el código funcione). Para ello, siempre R ofrece opciones de ayuda (mala noticia, están en inglés), que se activan corriendo los códigos:

?sqrt()

help("sqrt")

Ambas opciones mandan a abrir un PDF en línea con los detalles generales de la función elegida.

Otro concepto clave: paquetes[editar]

Como se dijo, hay miles de funciones disponibles en R. Si todas estuvieran disponibles al abrir la sesión (forma en que decimos que abrimos el software), la RAM de la computadora sería sencillamente desbordada. Por esto, además de por cuestiones de desarrollo (las funciones de R son desarrolladas a veces por los mismos usuarios), las distintas funciones se agrupan en paquetes (sinónimo, librerías).

Las librerías contienen un grupo de funciones y sus argumentos que, generalmente, sirven para una aplicación específica de la estadística. Hay casos particulares en los que las librerías contienen los códigos necesarios para enlazar R con otras aplicaciones (ej. Google Earth Engine) o incluso para desarrollar aplicaciones.

A su vez, no todos los paquetes están instalados, por el mismo motivo de espacio.

install.packages()

Es la función utilizada para instalar un determinado paquete. El nombre del mismo va en el paréntesis, entre comillas.

library()

Este código permite invocar la librería/paquete. Al "invocarla", todas sus funciones y argumentos quedan disponibles durante la sesión.

Los paquetes se instalan una sola vez en la computadora, pero deben ser invocados cada vez que abrimos el software.

Hay paquetes base que están abiertos de antemano en R, como por ejemplo (tan luego) base, o también stats.

Los paquetes también tienen un manual de ayuda (a veces de dimensiones bíblicas) que es invocable mediante help(package = "Nombre_del_paquete").

Analizando una tabla[editar]

Estaremos trabajando con datos presentes en mi repositorio Github, que podrán descargar yendo al siguiente link:

Punto importante. R no reconoce los archivos .idb que usa InfoStat por defecto. Algunos archivos que sí reconoce son:

  • .csv, .xlsx y otras similares procedentes de Excel
  • .txt, archivos de texto
  • .shp, .gpkg y otros archivos de datos espaciales

InfoStat permite guardar las tablas como .txt.

Ingresando los datos[editar]

En este caso, vamos a trabajar con una base de datos con la que estoy trabajando yo, que contiene respuestas a una encuesta realizada en la UNC. Es un archivo .txt, por lo que la función requerida se denomina read.table. Si fuera un archivo Excel, la función es diferente (read.csv por ejemplo).

La base la pueden descargar aquí.

dass <- read.table("C:/dass.completo.txt")
#En este código, asigno a "dass" el valor de "dass.completo", es decir una tabla
#Función read.table

dass
head(dass)
#La función head() permite ver las primeras 6 columnas de la tabla
#Observen que los encabezados aparecen como fila 1

dass <- read.table("C:/dass.completo.txt", header = TRUE)
#Reescribiendo el renglón 1, agregamos un argumento header = TRUE)
#Ese argumento indica a R que la tabla ya tiene nombres de columnas

Lo que aparece dentro de la función read.table es la ubicación exacta del archivo que quiero leer. Cada uno en su PC le deberá agregar algo, posiblemente sea algo similar a C:/Users/Documents/Downloads/dass.completo.txt . Cuando ejecutamos el renglón 10 y repetimos el head(dass), R nos devuelve las primeras 6 columnas de la tabla, más los encabezados.

> head(dass)
  Case AÑO.ENCUESTA EDAD SEXO INGRESO          DOMICILIO FINANC.FAMILIA
1    1         2022   20    F    2020 VIVIENDA.ALQUILADA              1
2    2         2022   20    F    2020    VIVIENDA.PROPIA              1
3    3         2022   21    F    2020 VIVIENDA.ALQUILADA              1
4    4         2022   21    F    2020 VIVIENDA.ALQUILADA              1
5    5         2022   20    M    2020 VIVIENDA.ALQUILADA              1
6    6         2022   21    F    2020    VIVIENDA.PROPIA              1
  FINANC.PRSOC FINANC.TRABAJO FINANC.OTRO         LABORAL PSICOFARM ES1 AN2 DE3
1            0              0           0 NO.TRAB.NO.BUSQ         0   1   2   1
2            0              0           0 NO.TRAB.NO.BUSQ         0   2   1   1
3            0              0           0 NO.TRAB.NO.BUSQ         0   1   0   1
4            0              1           0         SI.TRAB         0   3   1   2
5            0              0           0 NO.TRAB.NO.BUSQ         0   0   3   1
6            1              0           0 NO.TRAB.NO.BUSQ         0   3   1   1
  AN4 DE5 ES6 AN7 ES8 AN9 DE10 ES11 ES12 DE13 ES14 AN15 DE16 DE17 ES18 AN19
1   0   1   1   1   0   2    1    1    2    2    1    0    1    1    2    1
2   0   2   2   1   1   2    1    2    2    2    1    0    0    1    1    0
3   0   2   0   1   2   3    1    1    1    1    1    0    0    0    0    0
4   1   2   1   1   0   2    1    1    2    3    1    1    2    3    2    1
5   0   2   0   0   0   1    0    1    1    1    0    0    1    0    0    0
6   0   2   3   2   1   3    0    2    3    2    1    1    0    1    3    1
  AN20 DE21 DEPRESION ANSIEDAD ESTRES TOTAL
1    1    0         7        7      8    22
2    1    0         7        5     11    23
3    1    0         5        5      6    16
4    1    1        14        8     10    32
5    0    0         5        4      2    11
6    2    0         6       10     16    32

Si no usáramos la función head() y directamente ejecutásemos dass, R nos mostrará todas las filas que queden hasta que la memoria no dé más. En este caso no llega a ese límite, por lo que muestra las 489 filas de la tabla.

Si quisiéramos saber el número de filas presentes en la tabla, se puede correr la función nrow(dass). Si quisiéramos saber el número de variables, se puede ejecutar la función ncol(dass).

Podríamos ver una sola fila, o una sola columna de esa tabla, que fuera de interés. Para ello hay dos alternativas:

  • Uso de corchetes [,]: siempre posterior al nombre de la tabla, se puede ubicar un par de corchetes donde se deben agregar dos valores separados por coma. No es obligatorio poner dos valores. Si se pone un 0 da error.
  • Uso del signo $: para mostrar una determinada columna de una tabla, se puede nombrar la tabla, seguida de $ y luego el nombre de la columna, bien redactado. En Excel el símbolo ! utilizado para referir a una celda de otra hoja tiene un rol similar.
nrow(dass)
ncol(dass)

dass[,3] #llama la columna 3 de la tabla
dass[3,] #llama la fila 3 de la tabla
dass[3,3] #llama la celda ubicada en fila 3, columna 3

dass$EDAD #formato alternativo para llamar la columna 3
dass$edad #si pongo el nombre de columna en minúscula, R no encuentra la columna y da NULL

colnames(dass) #Me entrega los nombres de todas las columnas de la tabla

Como apoyo, podríamos ver la tabla dass en una pestaña aparte. Esto se puede hacer desde " Archivo --> Mostrar archivo(s)... " en la parte superior izquierda de la ventana. Pero mostrar el archivo no ayuda en sí a ingresar los datos al programa. Esta función es simplemente un visor.

Tipos de datos[editar]

Al aplicar head(dass) podemos ver que son varios los tipos de variables presentes, o al menos dos:

  • Variables cuantitativas discretas (edad, puntaje de las preguntas de la encuesta)
  • Variables cualitativas (nominales)

En R las cosas tienen un nombre un poquito distinto del que usamos en InfoStat. Los tipos de variables que identifica R son:

  • Variables Cuantitativas:
    • Integer: números enteros (lo que denominamos variable discreta)
    • Numeric: variables continuas
  • Variables Cualitativas:
    • Character: un determinado texto
    • Factor: un número que se nos muestra como un valor de texto. Dato numérico representado por una etiqueta.
    • Lógico: variable binaria que alterna entre TRUE o FALSE
  • Datos faltantes:
    • Valor perdido o no disponible: NA
    • Valor vacío o nulo: NULL

El tipo de variable de cada columna puede chequearse aplicando la función class() a una determinada columna. Para el caso de esta encuesta, hay NAs presentes en la variable "PSICOFARM" (detalle técnico: la pregunta era si los estudiantes habían ingerido psicofármacos, al ser una pregunta algo delicada, se debe poner la opción "prefiero no contestar", la cual se tradujo a NA para trabajar en R). Al ser modificados a NA, R no tiene en cuenta esos valores para los análisis.

Cambiando el tipo de dato[editar]

Hay variables que pueden estar numerificadas (glosario: variable cualitativa registrada como una cuantitativa o, en este caso, binaria). Ejemplos son las variables FINANC. que aparecen en esta base de datos. Así, FINANC.OTRO aparece como "integer", aunque más bien debería tener rol de Factor.

P: Por qué me preocupa el tipo de variable?

R: porque de eso dependerá los análisis que yo pueda realizar. Si mantengo FINANC.OTRO como numérica, al pedir análisis básicos me dará una media, mediana, cuartiles, etc., medidas que no me interesan porque no tienen sentido en mi estudio.

Si yo quisiera transformar la variable, hay una serie de funciones disponibles. En este caso, yo quisiera que FINANC.OTRO sea una variable "Factor". Para ello, se puede utilizar la función as.factor().

class(dass$FINANC.OTRO) #da "Integer"
dass$FINANC.OTRO <- as.factor(dass$FINANC.OTRO)
class(dass$FINANC.OTRO) #da "Factor"

typeof(dass$FINANC.OTRO) #función alternativa con igual resultado en este caso

class(dass$LABORAL) #da "Character"
dass$LABORAL <- as.numeric(dass$LABORAL) #da ERROR

El código de abajo reasigna a la columna FINANC.OTRO los valores de la misma columna (notar el <-), pero con diferente tipo de dato. Hay funciones similares para otros tipos de variable (as.numeric, as.integer, etc.). Estas funciones fuerzan al dato a cambiar de tipo, este forzamiento se denomina coerción.

Esta conversión no es totalmente libre, y depende de las propiedades que tiene el conjunto de datos que quiero alterar. La variable "LABORAL" tiene cuatro niveles definidos por texto. Si quiero convertirla a una función de tipo numérico, me da error. Es lógico porque no hay ninguna forma de numerificar la variable. Este intento de "forzar" la variable genera múltiples NAs (datos perdidos).

Tipos de estructura de datos[editar]

El objeto dass tiene una estructura dada, que proviene del archivo .txt del que la cargué. Esa estructura es de tabla o, hablando en R, de data.frame.

Si quisiéramos aislar una columna de la tabla, por ejemplo Depresión, podríamos nombrar un objeto nuevo, dass_DEPRESION. Ese objeto es unidimensional, en contraste a la bidimensionalidad de una tabla.

Los objetos compuestos por datos unidimensionales en R se conocen como Vector. Si volvemos a la x que habíamos estimado hace rato, esa x es un vector.

dass_DEPRESION <- dass$DEPRESION

is.data.frame(dass)
is.vector(x)
is.vector(dass_DEPRESION)

Las pruebas is.data.frame e is.vector son funciones lógicas, que devuelven sólo TRUE o FALSE. Tienen sinónimos a nivel tipo de dato (ej.: is.numeric).

Estos son los dos principales tipos de objetos. Otros formatos son matrices (bidimensionales) y listas (conjuntos de objetos).

Una utilidad adicional de los vectores es la visualización de varias columnas de una tabla, se puede crear vectores con la función c(), agregando números separados por coma.

dass[, c(1, 2, 3)]

Si se ejecuta esa línea, R mostrará las primeras tres columnas de la tabla, del mismo modo que si ejecutamos dass[, c(1 : 3)]. En este caso, los dos puntos tienen una función idéntica a la que tienen en Excel.

Analizando las variables[editar]

Ya vimos los tipos de datos que pueden contener las tablas. Ahora nos centraremos un poco más en los valores.

Recién acá empezamos con lo que es más estadística.

Estadística descriptiva[editar]

En este sentido, la función más básica disponible es summary(), que me permite ver, por cada variable, una serie de medidas resumen default, que son media, mediana, Q1, Q3, mínimo y máximo. Notar en la salida que:

  • Para columnas tipo caracter, imprime la longitud (en criollo, cantidad de datos) y aclara que la variable es tipo caracter
  • Para la columna FINANC.OTRO, que coercionamos a "factor", me da la frecuencia absoluta de cada nivel de la variable (0 y 1)

Ahora nos centraremos en la variable TOTAL. Esta variable muestra el puntaje total de cada estudiante en la encuesta.

summary(dass)

summary(dass$TOTAL) #entrega medidas de posición
mean(dass$TOTAL)    #entrega específicamente la media
sd(dass$TOTAL)      #entrega el desvío estándar
var(dass$TOTAL)     #entrega la varianza

aggregate(dass$TOTAL, by = list(dass$PSICOFARM), mean)

La función aggregate() permite obtener medidas resumen determinadas con un criterio de clasificación, estimado en el argumento by = list(). En este caso pedimos la media (mean) para los puntajes totales de los que tomaron psicofármacos y los que no tomaron psicofármacos.

La librería psych contiene una función de descripción específica, describe(), que contiene otras medidas que pueden o no resultar de interés.

Pruebas T y Análisis de la Varianza[editar]

La prueba T de student puede ser llamada a través de la función t.test(). Si seleccionamos una sola variable, R hará una estimación bilateral de la media. Si agregamos una variable extra, que debe ser categórica binaria (es decir, tener dos categorías), R hará una prueba de hipótesis para dos muestras.

#-Pruebas de Hipótesis------------------------------------

t.test(dass$TOTAL)
#Estimación de la media

t.test(dass$TOTAL, conf.level = .90)
#Estimación de la media con confianza del 90%

t.test(dass$TOTAL, mu = 18)
#Prueba de hipótesis de media muestral frente a parámetro = 18

t.test(dass$TOTAL~dass$PSICOFARM)
#Prueba de hipótesis de dos muestras

t.test(dass$TOTAL~dass$PSICOFARM, alternative = "greater")
#Prueba de hipótesis unilateral derecha

Notar la presencia del ~, que en este caso tiene una función específica de señalar un criterio de clasificación. Si probamos con un criterio de clasificación con más de dos niveles, sale error. La salida se asemeja a esto:

> t.test(dass$TOTAL~dass$PSICOFARM)
        Welch Two Sample t-test

data:  dass$TOTAL by dass$PSICOFARM
t = -4.8863, df = 25.73, p-value = 4.655e-05
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
 -21.390122  -8.718082
sample estimates:
mean in group 0 mean in group 1 
        23.3459         38.4000

La salida tiene exactamente la misma información que la de InfoStat, aunque en diferente orden. Para realizar un análisis de la varianza, existen una serie de funciones. La utilizada para comparar medias es aov(). Esta función me exige que yo le agregue un modelo. Para ello la sintaxis es similar a la que acabamos de usar en las pruebas T, utilizando ~ donde solemos poner un símbolo igual.

> anava <- aov(dass$TOTAL ~ dass$SEXO)
#Modelo con un solo efecto
> summary(anava)
             Df Sum Sq Mean Sq F value   Pr(>F)    
dass$SEXO     2   3747  1873.4   12.21 6.69e-06 ***
Residuals   486  74560   153.4                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

> anava1 <- aov(dass$TOTAL ~ dass$SEXO + dass$PSICOFARM)
#Modelo con dos efectos, podría tener la interacción también
> summary(anava1)
                Df Sum Sq Mean Sq F value   Pr(>F)    
dass$SEXO        2   3461    1730   11.93 8.83e-06 ***
dass$PSICOFARM   1   4896    4896   33.75 1.15e-08 ***
Residuals      472  68470     145                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13 observations deleted due to missingness

Nuevamente la información brindada es similar a la que da InfoStat, pero en distinta presentación. En este caso, ambos ANAVA encuentran diferencias significativas entre los distintos niveles de ambas variables.

Para utilizar un Test a posteriori, se puede utilizar la función específica. Para estimar el LSD Fisher es necesario llamar la librería agricolae.

En este caso haremos los tests sobre la variable PSICOFARM, la cual resulta de mayor interés en mi investigación.

> anava2 <- aov(TOTAL ~ PSICOFARM, data = dass)
#Modelo con otro efecto
> summary(anava2)

> dass$PSICOFARM <- as.factor(dass$PSICOFARM)
#IMPORTANTE. R no tolera que la variable categórica permanezca como integer
#Se recomienda cambiarlas a "factor" como hicimos más arriba

> TukeyHSD(anava2)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = TOTAL ~ PSICOFARM, data = dass)

$PSICOFARM
       diff      lwr      upr p adj
1-0 15.0541 10.09686 20.01134     0

Tukey compara pares de medias, como en este caso hay sólo dos medias, realiza una comparación, la cual resulta en una diferencia significativa.

> install.packages("agricolae")
> library(agricolae)
> testLSD <- LSD.test(anava2, "PSICOFARM")
> testLSD$groups
    TOTAL groups
1 38.4000      a
0 23.3459      b

La salida del Test LSD Fisher es bastante más larga, por lo que en este caso pedí que se viera sólo la parte groups donde me muestra las letras de diferenciación. La diferencia entre medias es notablemente superior a la DMS

Realizando gráficos[editar]

R está asociado a un software que crea gráficos de muy buena calidad, siempre y cuando se editen bien a nivel código. A diferencia de InfoStat, R no permite tener varios gráficos abiertos al mismo tiempo, por lo que siempre que arme un gráfico nuevo, perderé el anterior. Esta [a veces] desventaja no es tal en RStudio, que sí almacena gráficos.

R tiene una librería base llamada graphics que cuenta con funciones sencillas para realizar los gráficos más comunes.

plot(dass$SEXO) #Da un gráfico de barras según la frecuencia
plot(dass$TOTAL) #Da un gráfico de dispersión desordenado
hist(dass$TOTAL) #Da un histograma de frecuencia absoluta
pie(table(dass$ES1)) #Da un gráfico de torta o sectores
plot(dass$TOTAL~dass$SEXO) #Da un Box-Plot

i <- c(34:37)
plot(dass[,i]) #Genera una matriz de diagramas de dispersión

plot(function(x) x^2,10,100) #Grafica una función matemática dada

La función plot() decide cómo graficar en función del tipo de dato aportado. Es importante destacar el caso de pie(), que requiere armar una "tabla" separada con la variable a graficar (notar el table( en el código).

La función function(x) es una función especial que permite redactar funciones matemáticas. En el renglón 10 se solicita el gráfico de una función exponencial.

Argumentos para funciones gráficas[editar]

Todo lo que se puede ver en un gráfico se puede modificar, y en R eso se logra utilizando distintos argumentos.

  • Color de un gráfico:
    • Color del objeto (barra, caja, punto): modificable con el argumento col. Este argumento puede tener como respuesta:
      • El nombre de un color (ej. "red", "green", "white", "darkgreen"). Se pueden consultar ejecutando colors().
      • El código RGB de un color (ej. rojo es "#FF0000").
      • Una paleta pre-definida por una función, por ejemplo rainbow(). Otras funciones gráficas aceptan paletas más estéticas.
      • El número de orden de un color.
plot(dass$SEXO, col = "#FF6666") 				    #color fijo
plot(dass$SEXO, col = 3:5) 				          #colores asignados por una paleta
plot(dass$SEXO, col = rainbow(3)) 				    #colores asignados por una paleta
plot(dass$SEXO, col = c("#FF6666", "#66FF66", "#6666FF")) #colores asignados a mano
#Edición de color de barras mediante col

plot(dass$TOTAL, col = dass$PSICOFARM) #color asignado por valor de otra variable
  • Títulos y etiquetas:
    • Añadir un título: se utiliza el argumento main.
    • Ajustar el color del título: se utiliza el argumento col.main.
    • Ajustar el tamaño del título: argumento cex.main
  • Cambio de nombre de los ejes: argumentos xlab e ylab según el eje. "lab" quiere decir "etiqueta".
    • Funciones de color y tamaño son similares a lo que se dijo para el título
plot(dass$SEXO, main = "Gráfico de Prueba")
plot(dass$SEXO, main = "Gráfico de Prueba", col.main="green")
plot(dass$SEXO, main = "Gráfico de Prueba", cex.main=4)
#Adición y edición de un título

plot(dass$SEXO, xlab="Sexo del encuestado", ylab = "Frecuencia")
#Cambio nombre de los ejes

plot(dass$SEXO, xlab="Sexo del encuestado", col.lab = "darkgreen")
#Ajuste del color del nombre de eje
  • Otras funciones varias:
    • xasp o yaxp: edición de los ticks que tendrá el eje x o y, según corresponda
    • xlim o ylim: delimitación con máximo y mínimo de las dimensiones de uno de los ejes del gráfico, según corresponda
  • Funciones específicas para diagramas de dispersión:
    • pch: determina el tipo de símbolo que representa cada punto
    • cex: determina el tamaño de cada punto
    • lwd: para algunos símbolos, determina el grosor del borde
    • bg: para algunos símbolos, determina el color de relleno
plot(dass$SEXO, yaxp = c(0, 350, 5))
#Ajustes sobre los ticks
#En el vector, el primer número indica el mínimo
#El segundo número, el máximo
#El tercer número, la cantidad de ticks

plot(dass$TOTAL, ylim = c(0,44))
plot(dass$TOTAL, ylim = c(0,120))
#Modificación de los puntos máximo y mínimo del eje

plot(dass$TOTAL)
plot(dass$TOTAL, pch = 15)#Modifica la forma de los puntos
plot(dass$TOTAL, cex = 2) #Modifica el tamaño de los puntos
plot(dass$TOTAL, lwd = 3) #Modifica el grosor de los bordes
plot(dass$TOTAL, pch = 21, bg = "red") #Color de relleno de puntos

Un gráfico con todas las funciones vistas[editar]

plot(dass$TOTAL, col = dass$PSICOFARM, pch = 16, ylim = c(0,75), yaxp = c(0,70,7), xlab = "Caso", ylab = "Puntaje total DASS-21")

#Se le puede agregar una leyenda:
legend(x = "topleft", legend = c("No", "Sí"), fill = c("black", "#DF536B"), title = "Psicofármacos" )

La función legend() permite agregar una leyenda al último gráfico realizado; es una tarea algo más compleja. Para el entusiasta, los argumentos que figuran son estos:

  • x = "topleft" está posicionando la leyenda en la parte superior izquierda del gráfico.
  • legend = c(...) está indicando los nombres que lleva cada nivel de la leyenda
  • fill = c(...) está indicando los colores respectivos para cada nivel de la leyenda
  • title() indica cuál es el título de la leyenda

Otro gráfico: matriz de correlaciones[editar]

Simplemente por lo estético, muestro este gráfico extra, muy agradable a la vista para ver correlaciones.

En el gráfico pretendemos ver la correlación que hay entre las respuestas a los distintos items de la escala D.

attach(dass)
items <- data.frame(DE3, DE5, DE10, DE13, DE16, DE17, DE21)
cor.plot(items)

Sección de comentarios finales[editar]

R es un software en constante desarrollo. Siempre llega alguien nuevo con una función nueva que hace un análisis nuevo, o bien que hace un poquito mejor un determinado análisis más común. El día 31 de octubre de 2023 salió una nueva versión de R, en conjunto con nuevas versiones de algunos paquetes. Los desarrolladores informan con tiempo a la comunidad sobre los cambios, para que los tengan presentes. Algunos de esos cambios, de ayer a hoy, hicieron que algunas funciones que tenía guardadas no anden más.

Las versiones de R más viejas tienen problemas con el uso de algunos paquetes. Este script que usé está probado para la versión 3.6.4, pero podría tener inconvenientes en versiones superiores.

Recomendaciones[editar]

  • Formarse en informática. Ustedes van a seguir siendo profesionales en el año 2070, imagínense cuánto puede llegar a depender un contrato de saber usar una computadora (no necesariamente programar, pero lo básico).
  • Buscar seminarios y manuales en línea. Este en particular me fue de mucha ayuda al iniciar.