Analítica Avanzada de Datos

Challenge #1

Autor/a
Afiliación

Universidad del Norte, Barranquilla

Fecha de publicación

20 de mayo de 2024

Introducción

En esta actividad se analizarán datos provenientes de una tarea repetitiva en niños y adultos diagnosticados y no diagnosticados en Trastorno de Déficit de Atención con Hiperactividad (ADHD en inglés), residentes en Barranquilla.

Los datos se encuentran aquí.

Las variables de interés son sexo, edad, adhdstatus y las variables del seguimiento trait_A1, trait_A2, \(...\), trait_A50. Estas últimas representan el estado de finalización de la tarea. La tarea se cuantifica en una escala de 1 a 5. Por simplicidad, valores diferentes a 5 se consideran no exitosos.

Fecha de entrega: Sábado, 25 de Mayo de 2024.

Preguntas

P1

Suponga que la respuesta de un individuo puede resumirse en el vector 01000111111101100100001110100111100110000111001110. Construya una función que permita calcular la entropía de Shannon a partir de un string de 0s y 1s. Calcule la entropía \(H\) para cada individuo. Estudie la distribución de \(H_1, H_2,\ldots, H_n\) por sexo y dignóstico de ADHD. Qué observa?

Respuesta. Aquí escribe la respuesta.

Lectura de datos:

Código
datos <- read.delim("~/MG ESTADÍSTICA APLIC/ANALITICA AVANZ DE DATOS/analitica-avanzada-datos/taskA.txt")

Se construye una función para calcular la entropía de Shannon a partir del string de 0s y 1s. Se comienza definiendo el string de valores:

Código
s <- "01000111111101100100001110100111100110000111001110"

Se define la función:

Código
ent <- function(s){
  ss <- strsplit(s, "")[[1]]
  p <- prop.table(table(ss))
  -sum(p*log2(p))
}

La entropía de Shannon es 0.9953784.

Para calcular la entropía de cada uno de los individuos, primero se construye el data frame con los intentos:

Código
intentos <- data.frame(datos[, 8:57])

A continuación, se define la función para calcular la entropía de cada uno de los individuos. Esta función tiene como entrada el data frame que contiene los intentos de cada uno.

Código
H <- function(df){
  #Vector que contiene los valores de entropía
  ent_v <- c()
  
  for (i in 1:nrow(df)){
    #Convierte los valores de los intentos en 1s y 0s
    for(j in 1:ncol(df)){
      
      if (df[i, j] != 5){
        df[i, j] <-  0}
      else{ df[i, j] <- 1}
      
    }
  #Convierte los valores de cada fila en un string  
  aux_ent <- paste0(intentos[i, ], collapse = "")
  
  #Se utiliza la función definida anteriormente para calcular la entropía por cada
  #individuo
  ent_v[i] <- ent(aux_ent)
  
  }
  print(ent_v)
}

Aquí se muestran los 10 primeros valores de entropía de cada uno de los individuos:

Código
int10[1:10]
 [1] 1.1140670 0.9895875 1.6781188 1.0974560 0.9580420 1.3908563 0.9953784
 [8] 1.0000000 1.2022922 1.3197782

Ahora, se analiza la distribución de la entropía por sexo y diágnostico de ADHD.

Sexo:

Se toma la base de datos, se extraen las columnas de sexo y los 50 traits. Además, se le añade una columna con la entropía de cada individuo.

Código
int_sexo <- datos[ , c(2, 8:57)]%>%
  mutate(entropia = H(datos[ , c(2, 8:57)]))

Ahora, se realiza un histograma con la distribución de la entropía categorizado por el sexo de los individuos.

Código
int_sexo%>%
  ggplot(aes(x = entropia, fill  = sexo)) +
  geom_histogram(bins = 30, color = "black") +
  facet_grid(.~sexo) + 
  theme_minimal() + 
  labs(title = "Distribución de la entropía de acuerdo al sexo")

Diagnóstico de ADHD:

Se toma la base de datos, se extraen las columnas de diagnóstico de ADHD y los 50 traits. Además, se le añade una columna con la entropía de cada individuo.

Código
int_adhd <- datos[ , c(4, 8:57)]%>%
  mutate(entropia = H(datos[ , c(4, 8:57)]))

Ahora, se realiza un histograma con la distribución de la entropía categorizado por el sexo de los individuos.

Código
int_adhd%>%
  ggplot(aes(x = entropia, fill  = as.factor(adhdstatus))) +
  geom_histogram(bins = 30, color = "black") +
  facet_grid(.~adhdstatus) + 
  theme_minimal() + 
  labs(title = "Distribución de la entropía de acuerdo al diagnóstico")

De las distribuciones de la entropía según el sexo y el diagnóstico de ADHD, se puede observar que la distribución es muy similar en todos los casos, lo que sugiere un comportamiento consistente entre los individuos, independientemente de su sexo o diagnóstico de ADHD. Esta similitud en las distribuciones indica que las diferencias en la entropía no son significativas entre los distintos grupos, lo que refuerza la idea de que los patrones de comportamiento en términos de entropía son homogéneos en la población estudiada.

Además, la entropía presenta una distribución sesgada hacia la izquierda, donde la mayoría de los individuos muestran valores de entropía alrededor de 1 a 1.25. Este sesgo indica que hay una concentración notable de individuos con baja entropía. Dado que el valor máximo de entropía observado se sitúa alrededor de 2, se puede inferir que en la mayoría de los casos, los individuos no experimentan niveles altos de entropía.

La baja entropía sugiere que hay poca incertidumbre respecto al cumplimiento de la actividad en intentos futuros. En otras palabras, la predictibilidad del comportamiento de los individuos es alta, lo que implica que, una vez que han aprendido o adoptado un patrón de acción, es poco probable que se desvíen significativamente de dicho patrón. Este hallazgo puede ser particularmente útil en contextos donde se busca entender la capacidad de los individuos para seguir rutinas o procedimientos establecidos, y podría tener implicaciones importantes en el diseño de intervenciones o programas de apoyo para personas con ADHD, enfocándose en reforzar estos patrones predictivos y reduciendo la variabilidad e incertidumbre en sus comportamientos.

En conclusión, la similitud en las distribuciones de la entropía entre los diferentes grupos y la tendencia general hacia valores bajos de entropía sugieren que los individuos, independientemente de su sexo o diagnóstico de ADHD, tienden a tener comportamientos predecibles con poca incertidumbre en sus acciones futuras. Esto puede ser un indicador positivo en términos de la capacidad de los individuos para aprender y mantener comportamientos consistentes a lo largo del tiempo.

P2

Considere el vector anterior. Construya una función que calcule el número de cambios de estado. En este caso, una matriz de transición podría ayudar.

Respuesta. Aquí escribe la respuesta.

Código
trans <- function(x){
  ## número de caracteres
  n <- nchar(x)
  
  ## número de 1s
  aux <- strsplit(x, "")[[1]]
  n1 <- sum(aux == 1)
  
  ## número de 0's
  n0 <- sum(aux == 0)
  
  ## aux lag
  auxlag1 <- c(aux[-1], NA)
  
  ## transiciones
  nij <- as.numeric(table(aux, auxlag1))
  names(nij) <- c('n00', 'n10', 'n01', 'n11')
  
  ## resultado
  table(aux, auxlag1, deparse.level = 0)
}

Aquí vemos la matriz de cambios de estado para el string s del ejercicio anterior:

Código
trans(s)
   
     0  1
  0 12 10
  1 10 17

P3

Construya la matriz de transición para el individuo 83. Calcule \[P(s+1 = j | s = i)\] donde \(s\) es el intento e \(i,j=\{\)0,1\(\}\). Defina esta matriz de probabilidades como \(\mathbf{P}^{(1)}\). Tenga en cuenta que \(\mathbf{P}^{(1)}\) es de dimensión \(2\times 2\).

Respuesta. Aquí escribe la respuesta.

Para la matriz de transición de cualquier individuo del data frame, tomando en cuenta su uid, se construye la siguiente función que tiene como argumento el uid del individuo.

Código
trans_by_uid <- function(id){
  
  #toma los intentos del individuo basado en su uid
  aux <- filter(datos, uid == id)[8:57]
  
  #convierte los valores a 0s y 1s
  for (i in 1:ncol(aux)){
    if (aux[1, i] == 5){
      aux[1, i] <- 1}
    else {aux[1, i] <- 0}
  }
  
  #convierte el vector de intentos en un string
  ind <- paste0(aux, collapse = "")
    
  print(trans(ind))
}

Así, se muestra la matriz de transición para el individuo con uid = 83.

Código
trans_by_uid(83)
   
     0  1
  0 15 14
  1 14  6

Ahora, para calcular la matriz de probabilidades \(\mathbf{P}^{(1)}\), se toma la matriz de transición y se divide cada componente con el correspondiente total de cambios, teniendo en cuenta el condicional definido en la probabilidad.

Esto es, para cambios 00 y 01, se toman las componentes de la fila superior de la matriz de transición, y para cambios 10 y 11 las filas inferiores.

A continuación, la función que toma la matriz de transición y calculas las probabilidades:

Código
prob_by_uid <- function(id) {
  
  trans_matrix <- trans_by_uid(id)
  
  #muestra el total de cambios basado en el intento anterior
  total <- c(sum(trans_matrix[1, ]),
             sum(trans_matrix[2, ]),
             sum(trans_matrix[1, ]),
             sum(trans_matrix[2, ]))
  
  #calcula la proporción(probabilidad) de cada estado de cambio
  result <- trans_matrix/total
  
  print(result)
}

Así, se muesta la matriz de probabilidades \(\mathbf{P}^{(1)}\) para el individuo 83.

Código
prob_by_uid(83)
   
     0  1
  0 15 14
  1 14  6
   
            0         1
  0 0.5172414 0.4827586
  1 0.7000000 0.3000000

P4

Construya la matriz de transición en el paso \(k\) utilizando la propiedad de Markov para matrices de transición, esto es

\[ \mathbf{P}^{(k)}_M = \underset{k\text{-veces}}{\underbrace{\mathbf{P}^{(1)}\times \mathbf{P}^{(1)}\times\mathbf{P}^{(1)}\times\cdots\times\mathbf{P}^{(1)}}} \]

En la expresión anterior, \(M\) simboliza el hecho de que está utilizando la propiedad de Markov para matrices de transición. Además, el símbolo \(\times\) se refiere a multiplicación matricial y no a potencias.

Respuesta. Aquí escribe la respuesta.

Para este ejercicio, se construye una función que tome como argumentos el uid del individuo, así como el número de pasos \(k\) para calcular la matriz de transición \(\mathbf{P}_{M}^{(k)}\) correspondiente.

Código
trans_k <- function(id, k) {
  
  P <- prob_by_uid(id)
  result <- P
  
  for (i in 1:(k-1)) {
    result <- result %*% P
  }
  
  rownames(result) <- c(0, 1)
  
  print(result)
}

Se prueba la función para calcular, por ejemplo, la matrix de transición en el paso \(k = 10\) del individuo 83.

Código
trans_k(83, 10)

Así, \(\mathbf{P}^{(10)}_M\) para el individuo 83 es:

\[ \mathbf{P}^{(10)}_{M} = \begin{bmatrix} 0.5918368 & 0.4081632\\ 0.5918367 & 0.4081633 \end{bmatrix} \]

P5

Calcule \(\mathbf{P}^{(k)}\) como \(P(s+k = j | s = i)\) para \(k=\{1,2,3,4\}\). Use una prueba \(\chi^2\) para tablas de contingencia y compare estos resultados con \(\mathbf{P}^{(k)}_M\). Concluya.

Respuesta. Aquí escribe la respuesta.

Código
## aquí va el código