Ejercicio 2

Este ejercicio acompaña a la guía de la sesión 2 sobre funciones, busca avanzar en el uso de funciones built-in comunes en R y desarrollar funciones propias.

El objetivo del ejercicio 2 es separar el dataset del ejercicio 1 en dos grupos en función de sus puntajes en narcisismo y comparar sus características. La

Completar las siguientes tareas:

Previo: abrir el script “ejercicio1”, cargar los datos del ejercicio 1 con la función load y decirle a R en qué directorio estamos trabajando [Session > Set Working Directory> To Source File Location] (ver instrucciones en ejercicio 1)

Parte A: Funciones Built-in

  1. Ordenar los datos de datosLimpios en orden decreciente de narcisismo usando la función order. Almacenar la salida en una variable llamada “datosLimpiosOrdenados”. Para esto hay que seguir 3 pasos:
  • aplicar la función order sobre la columna de puntajes de narcisismo del data frame “datosLimpios” usando el argumento decreasing, y almacenar la salida de la función en una variable. Mirar la variable. Entenderla. [psst: es el índice de las filas originales de datosLimpios ordenado en función del puntaje en narcisismo].
  • usar la salida de la función anterior como índice de filas para reordenar el data frame “datosLimpios”, y almacenar el data frame reordenado bajo el nombre “datosLimpiosOrdenados”
  • corroborar que el data frame “datosLimpiosOrdenados” efectivamente quedó ordenado en función del narcisismo. Usar la función plot para visualizarlo, copiar este comando: plot(datosLimpiosOrdenados$NPI16TOTAL). Mirar la pestaña PLOTS.
  1. Encontrar una función de R que devuelva las primeras 30 filas de un data frame. Encontrar una función de R que devuelva las últimas 30 filas de un data frame. Aplicarlas al data frame “DatosLimpiosOrdendos”" y almacenar la salida en una variable para cada una. Comparar los dos grupos con la función summary para cada variable. ¿En qué variables hay diferencias entre los grupos? ¿Esas diferencias son significativas? Tip: usar función t.test.

Parte B: Funciones definidas por usuario

  1. En el punto 3 del ejercicio 1 encontramos outliers para una determinada columna del data frame “datosLimpios”. Si quisieramos hacer lo mismo para el resto de las columnas,¿podemos convertir esta serie de comandos en una función definida por el usuario?

Soluciones

# paso i) ordeno la columna de narcisismo
o = order(datosLimpios$NPI16TOTAL, decreasing = TRUE)
# el vector o tiene la posición de las filas en orden decreciente según el puntaje de narcisismo

# paso ii) uso el orden de la columna de narcisismo para reordenar el data frame
datosLimpiosOrdenados = datosLimpios[o,]
# primeras 30 filas del data frame
LosMasNarcis = head(datosLimpiosOrdenados, n = 30)

# últimas 30 filas del data frame
LosMenosNarcis = tail(datosLimpiosOrdenados, n = 30)

summary(LosMasNarcis)
##  Sex         Age          NPI16TOTAL     GSESTOTAL       ADTOTAL     
##  M:15   Min.   :17.00   Min.   : 6.0   Min.   :21.0   Min.   : 8.00  
##  F:15   1st Qu.:19.00   1st Qu.: 7.0   1st Qu.:25.0   1st Qu.:17.50  
##         Median :21.50   Median : 7.5   Median :26.0   Median :19.00  
##         Mean   :23.00   Mean   : 7.9   Mean   :26.6   Mean   :20.15  
##         3rd Qu.:25.75   3rd Qu.: 8.0   3rd Qu.:28.0   3rd Qu.:23.00  
##         Max.   :34.00   Max.   :12.0   Max.   :33.0   Max.   :31.00  
##                                                       NA's   :3      
##     SDTOTAL        Sign.Area       Name.Area    
##  Min.   :20.00   Min.   :13.06   Min.   :12.02  
##  1st Qu.:27.75   1st Qu.:18.79   1st Qu.:14.80  
##  Median :31.00   Median :21.52   Median :17.07  
##  Mean   :30.21   Mean   :23.83   Mean   :18.91  
##  3rd Qu.:33.25   3rd Qu.:25.85   3rd Qu.:21.43  
##  Max.   :37.00   Max.   :49.15   Max.   :34.54  
##  NA's   :2
summary(LosMenosNarcis)
##  Sex         Age         NPI16TOTAL   GSESTOTAL        ADTOTAL     
##  M:12   Min.   :18.0   Min.   :0    Min.   :23.00   Min.   : 7.00  
##  F:18   1st Qu.:19.0   1st Qu.:0    1st Qu.:25.00   1st Qu.: 8.00  
##         Median :20.5   Median :0    Median :26.00   Median :11.50  
##         Mean   :23.4   Mean   :0    Mean   :26.39   Mean   :11.36  
##         3rd Qu.:25.0   3rd Qu.:0    3rd Qu.:28.00   3rd Qu.:13.25  
##         Max.   :40.0   Max.   :0    Max.   :31.00   Max.   :22.00  
##                                     NA's   :2       NA's   :2      
##     SDTOTAL        Sign.Area       Name.Area    
##  Min.   :15.00   Min.   :12.91   Min.   :10.84  
##  1st Qu.:24.75   1st Qu.:17.00   1st Qu.:13.34  
##  Median :28.50   Median :21.78   Median :16.61  
##  Mean   :27.86   Mean   :23.20   Mean   :21.02  
##  3rd Qu.:33.00   3rd Qu.:28.55   3rd Qu.:21.25  
##  Max.   :37.00   Max.   :38.33   Max.   :85.01  
##  NA's   :2       NA's   :3
# A simple vista hay diferencias en dominancia agresiva
# Hago una prueba t
t.test(LosMasNarcis$ADTOTAL, LosMenosNarcis$ADTOTAL)
## 
##  Welch Two Sample t-test
## 
## data:  LosMasNarcis$ADTOTAL and LosMenosNarcis$ADTOTAL
## t = 7.6187, df = 49.571, p-value = 6.844e-10
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##   6.472881 11.109129
## sample estimates:
## mean of x mean of y 
##  20.14815  11.35714
outliers = function(x) {
# calculo los límites de outliers
mediaName = mean(x, na.rm = T) #la media
desvName = sd(x, na.rm = T) #el desvío
outUp = mediaName + 3*desvName #guardo el umbral en una variable

# encuentro los no outliers
NotOutliers = x <= outUp

# guardo el vector lógico que indica con cuáles me quedo
return(NotOutliers) }