2. Análisis de concordancia en variables categóricas ✓
Clasificaciones binomiales
Casos donde la prueba diagnóstica solo presenta dos resultados distintos.
Analizamos si dos agentes que clasifican a los individuos según el resultado de la p.d. concuerdan en sus opiniones. También me sirve la discordancia completa. (sé que un agente siempre clasifica lo contrario al otro agente)
Como la p.d. depende del agente que me da la medida, tengo una variable aleatoria por cada agente.
X = “clasificación dada por el observador A.”
Y = “clasificación dada por el observador B.”
Dado un individuo este es analizado por el agente A y por el agente B.
\[
\displaylines{
& \text {Medidas para cada inidividuo} \\
&\begin{array}{ccc}
\hline
\text{individuo k} & X_k & Y_k
\end{array}
}
\]
Las dos entrevistas concuerdan el 40 % de las ocasiones. Puede no haber asociación real entre las dos entrevistas porque toda la concordancia puede atribuirse al azar.
Esta sería la máxima no concordancia, ya que si la diagonal principal acumula menos de la mitad de los casos podríamos medir una concordancia inversa.
El problema de \(\Pi_{0}\) es que incluye concordancia que puede atribuirse al azar. Y concordar por azar no es concordar.
Y bailar de lejos no es bailar.
Si los dos observadores clasificasen de forma independiente y, por tanto, totalmente al azar entre las dos categorías, la probabilidad de la concordancia \(p(X=Y)\) sería:
Medida de concordancia debida al azar: \(\Pi_c = \pi_{1.}\pi_{.1} + \pi_{2.}\pi_{.2} = \sum_{k=1,2} \pi_{k.}\pi_{.k}\)
A la concordancia global debo restarle la concordancia del azar.
Índice kappa (de Cohen)
Este índice es una medida basada en resultados teóricos.
\[k = \frac{\Pi_0-\Pi_c}{1-\Pi_c}\] tal que \[\Pi_0 = \pi_{11} + \pi_{22} \quad \text{y} \quad \Pi_c = \pi_{1.}\pi_{.1} + \pi_{2.}\pi_{.2}\]
A la concordancia le quita la concordancia debida al azar y lo compara con la concordancia perfecto sin contar la concordancia al azar. Es decir, a la concordancia y a la concordancia perfecta les substrae la concordancia debida al azar y compara la concordancia sin el azar obtenida contra la máxima concordancia sin el azar posible.
Podemos tener resultados negativos: el intervalor [-1,0) es sin corcondancia.
La probabilidad de acuerdo observado es una media ponderada del máximo acuerdo y del acuerdo debido al azar \(\Pi_c\), siendo \(k\) el peso del máximo acuerdo.
\[
\displaylines{
k = \frac{\Pi_0-\Pi_c}{1-\Pi_c} \\ \\
k * (1-\Pi_{i}) = (\Pi_{0} - \Pi_{c}) \\ \\
\Pi_{0} = k + (1-k)*\Pi_{c}
}
\]
El acuerdo observado es una combinación de la concordania perfecta y concordania debida al azar. El ínidce kappa da más peso a uno u otro.
Interpretación.]{underline}
La concordancia observada en los informes (84%) está compuesta por un 24,5% de la concordancia máxima y un 78,8% de la esperada al azar.
Medida de concordancia global: \(\Pi_0 = \sum_{i=1}^{t} \pi_{ii}\)
Medida de concordancia debida al azar: \(\Pi_c = \sum_{i=1}^{t} \pi_{i.}\pi_{.i}\)
Índice kappa: \(k = \frac{\Pi_0-\Pi_c}{1-\Pi_c}\)
Hay veces que nos interesa saber si la concordancia es mayor en unas categorías o en otras. Por ejemplo, en la categoría grave hay muchas concordancia pero en las categorías leve y media no. En este caso se suele estandarizar para tener dos categorías y medir concordancia para cada categoría.
cat<-"Leve"print(paste("Categoría de referencia:", cat))df_new<-df|>mutate("Otras"=df[,names(df)[!names(df)%in%cat]]|>rowSums())|>select(-c(names(df)[!names(df)%in%cat]))df_new["Otras",]<-df_new%>%filter(!row.names(df_new)%in%c(cat))|>colSums()df_new<-df_new|>filter(rownames(df_new)%in%c(cat,"Otras"))df_extended<-rbind(df_new, "Total"=colSums(df_new))df_new_extended<-df_extended|>mutate("Total"=rowSums(df_extended))# arreglar lo de las librerías(df_new_extended)print("Medida de concordancia global:")(pi_0<-sum(diag(as.matrix(df_new))))print("Medida de concordancia debida al azar:")pi_1<-0t<-dim(df_new_extended)[1]for(iinseq(1:(t-1))){pi_1<-pi_1+df_new_extended[i,t]*df_new_extended[t,i]}(pi_1<-pi_1|>unname())print("Índice kappa:")(k<-((pi_0-pi_1)/(1-pi_1))|>unname())
[1] "Categoría de referencia: Leve"
Leve Otras Total
Leve 0.1125 0.1375 0.25
Otras 0.1125 0.6375 0.75
Total 0.2250 0.7750 1.00
[1] "Medida de concordancia global:"
[1] 0.75
[1] "Medida de concordancia debida al azar:"
[1] 0.6375
[1] "Índice kappa:"
[1] 0.3103448
Código
cat<-"Moderada"print(paste("Categoría de referencia:", cat))df_new<-df|>mutate("Otras"=df[,names(df)[!names(df)%in%cat]]|>rowSums())|>select(-c(names(df)[!names(df)%in%cat]))df_new["Otras",]<-df_new%>%filter(!row.names(df_new)%in%c(cat))|>colSums()df_new<-df_new|>filter(rownames(df_new)%in%c(cat,"Otras"))df_extended<-rbind(df_new, "Total"=colSums(df_new))df_new_extended<-df_extended|>mutate("Total"=rowSums(df_extended))# arreglar lo de las librerías(df_new_extended)print("Medida de concordancia global:")(pi_0<-sum(diag(as.matrix(df_new))))print("Medida de concordancia debida al azar:")pi_1<-0t<-dim(df_new_extended)[1]for(iinseq(1:(t-1))){pi_1<-pi_1+df_new_extended[i,t]*df_new_extended[t,i]}(pi_1<-pi_1|>unname())print("Índice kappa:")(k<-((pi_0-pi_1)/(1-pi_1))|>unname())
[1] "Categoría de referencia: Moderada"
Moderada Otras Total
Moderada 0.3625 0.175 0.5375
Otras 0.1375 0.325 0.4625
Total 0.5000 0.500 1.0000
[1] "Medida de concordancia global:"
[1] 0.6875
[1] "Medida de concordancia debida al azar:"
[1] 0.5
[1] "Índice kappa:"
[1] 0.375
Código
cat<-"Grave"print(paste("Categoría de referencia:", cat))df_new<-df|>mutate("Otras"=df[,names(df)[!names(df)%in%cat]]|>rowSums())|>select(-c(names(df)[!names(df)%in%cat]))df_new["Otras",]<-df_new%>%filter(!row.names(df_new)%in%c(cat))|>colSums()df_new<-df_new|>filter(rownames(df_new)%in%c(cat,"Otras"))df_extended<-rbind(df_new, "Total"=colSums(df_new))df_new_extended<-df_extended|>mutate("Total"=rowSums(df_extended))# arreglar lo de las librerías(df_new_extended)print("Medida de concordancia global:")(pi_0<-sum(diag(as.matrix(df_new))))print("Medida de concordancia debida al azar:")pi_1<-0t<-dim(df_new_extended)[1]for(iinseq(1:(t-1))){pi_1<-pi_1+df_new_extended[i,t]*df_new_extended[t,i]}(pi_1<-pi_1|>unname())print("Índice kappa:")(k<-((pi_0-pi_1)/(1-pi_1))|>unname())
[1] "Categoría de referencia: Grave"
Grave Otras Total
Grave 0.175 0.0375 0.2125
Otras 0.100 0.6875 0.7875
Total 0.275 0.7250 1.0000
[1] "Medida de concordancia global:"
[1] 0.8625
[1] "Medida de concordancia debida al azar:"
[1] 0.629375
[1] "Índice kappa:"
[1] 0.6290051
Hasta ahora hemos hablado de probabilidades ya que estamos con el modelo teórico. Cuando trabajamos con datos de una muestra hablaremos de porcentajes.\(\Rightarrow\)“Este % es consecuencia de un acuerdo de xx y un azar de xx”
El índice kappa tiene una distribución teórica y lo estimo según una muestra. Con una poca información (la muestra) doy un intervalo. No doy intervalos de confianza para valores desconocidos sino para las estimaciones.
Cuanto más cercana a 0,5 sea la prevalencia (más equilibradas estén las marginales) mayor es el índice kappa, para igual probabilidad de acuerdos observados.
\[\Downarrow\]
Prevalencias muy altas o muy bajas penalizan el índice kappa.
El valor del índice kappa depende de la simetría y homogeneidad de las marginales.
En el primer caso el comportamiento de los agentes es homogéneo: pues ambos emiten informes positivos con mayor frecuencia.
En el segundo caso el comportamiento de los agentes es heterogéneo y asimétrico.
En ambos casos los diagnósticos del agente A distan 0.2 de 0.5.
El valor del índice kappa depende del equilibrio de las marginales.
Cuanto mayor sea la diferencia de la prevalencia observada de cada agente respecto de 0.5 mayor es el índice kappa. (incluso para un mismo valor de acuerdos observados).
Índice kappa ponderado.
Sólo tiene sentido para variables ordinales.
Está diseñado para recoger la idea de que algunas discordancias son más severas que otras y, por tanto, asigna pesos que representan la importancia entre los desacuerdos. El máximo peso se da a la concordancia perfecta y pesos proporcionalmente menores según la importancia del desacuerdo.
No tiene la misma importancia un desacuerdo en la clasificación entre las categorías leve y moderada que entre leve y grave, obviamente la última representa un mayor desacuerdo que la primera.
Medida de concordancia global: \(\Pi_0 = \sum_{i=1}^{t} \sum_{j=1}^{t} w_{ij} \pi_{ij}\)
Medida de concordancia debida al azar: \(\Pi_c = \sum_{i=1}^{t} \sum_{j=1}^{t} w_{ij} \pi_{i.}\pi_{.j}\)
\(p_ij\)la proporción de individuos asignados a la categoría i por el observador X y a la categoría j por el observador Y, donde i, j =1,2,…,t.
\(p_{i.}\)la proporción marginal de que un sujeto sea asignado a la clase i por el observador X (análogo para \(p_{.j}\), la clase j y el observador Y), donde i, j =1,2,…,t.
Es un estimador con una distribución asintótica normal.
\[ \kappa_w ~ N(\kappa_w, \sigma_{\kappa_w})\]
Tengo una distribucion normal centrada en k y al elegir un dato al azar (o sea, de la muestra aleatoria) puede tener un valor muy cercano o muy lejano de la media.
La varianza también es una estimación hecha con lo que yo he visto. Es otra estimación más. Esto hace que vayamos arrastrando aproximaciones AKA posibles errores.
Se podría hacer también un aproximación asintótica pero conlleva arrastrar una simulacion más.
La estimación puntual la tengo. Como no tengo una muestra más grande puedo remuestrear.
Los estimadores por intervalo miden la precision de la estimación puntual. Cómo de buena es esa estimación puntual para representar otra posible muestra que podríamos haber obtenido.
Una estimación puntual que se encuentra en alguno de los intervalos de Landis y Koch.
La validez de la estimacion hay que refrentarla con un IC. La estimación puntual de 0.245 se considera discreta y el \(IC_90 = (0.025, 0.465)\) abarca varios niveles, desde discreta hasta sustancial. Si el IC estuviera solo en el mismo intervalo que la estimación puntual diríamos que el IC respalda/valida la estimacion puntual. Al abarcar más de un nivel deberemos explicarlo.
En el 90 % de estudios similares a este tenemos una concordancia que iría desde insignificante a moderada. La validaz de nuestra estimación no es super cool, es cuestionable, ya que hay otros estudios donde podemos encontrar una concordancia diferente a la que hemos calculado en esta muestra.
H0: las opiniones son independientes (que no hay relación entre las opiniones) (si hay una concordancia que sea casual) AKA \(\rho\) = 0.
Para poder admitir \(\rho\) = 0 el IC tendría que darlo como un valor posible y en este caso no lo da. Rechazamos que haya un criterio diferente. (juzgamos que los dos puntúen por igual)
Ejemplo 1.4.
Dos psiquiatras evaluaron a 129 pacientes que habían sido diagnosticados previamente como clínicamente deprimidos. Las categorías de clasificación fueron: 0 para no deprimido, 1 para moderadamente deprimido y 2 para clínicamente deprimido. La tabla siguiente muestra los resultados de la clasificación realizada por los dos psiquiatras.
En la diagonal pone peso 0 (yo quiero que en la diagonal tiene 1 y conforme me alejo lo voy bajando).
Índice kappa sin ponderar.
Le damos importancia a todo lo que coincide pero no le damos peso a la cercanía entre dos diagnósticos. La elección por el kappa ponderado es crucial cuando los niveles de clasificación son mayores a dos niveles.
Estamos teniendo resultados 0.3, 0.4. Las estimaciones puntuales nos incitan a concordancias moderadas. No podemos decir que no tengan un criterio común. algo tienen.
¿Qué pasha cuando tenemos que analizar la validez de una estimación pero tenemos una muestra pequeña? Po a la metodología booststrap
Depués de remuestrar tengo las 23 radiografías con la clasificación de los dos radiólogos cuando remuestre.
Obtengo muestras bootstrap con 23 radiografias pero la clasificación es la misma para cada radiografía.
Calculo el kappa \(\Rightarrow\) calculo las diferencias \(\Rightarrow\) Despercio las más alejadas \(\Rightarrow\) Me quedo con el 95 % central.
Si hay más de 2 observadores \(\Rightarrow\) Índice de Kappa para múltiples observadores (Fleiss JL Statistical Methods for Rates and Proportions, 2003)