2010-04-01 26 views
15

¿Existen paquetes R para el cálculo de tau-b y tau-c de Kendall, y sus errores estándar asociados? Mis búsquedas en Google y Rseek no han encontrado nada, pero seguramente alguien las ha implementado en R.Medidas de asociación en R - Kendall's tau-b y tau-c

+7

Después de calcularlo a mano y comparar, encontré 'cor (x, y, method =" kendall ")' (que se encuentra en el paquete 'stats' preinstalado) proporciona tau-b de Kendall, * no * Tau-a de Kendall (Al menos, a partir de R versión 3.0.2.) – Firefeather

Respuesta

39

Hay tresKendal estadísticas tau (tau-a, tau-b, y tau-c).

Son no intercambiables, y ninguna de las respuestas publicadas hasta el momento se ocupan de los dos últimos, que es el tema de la pregunta del OP.

he podido encontrar funciones para calcular tau-tau o b-c, ya sea en la biblioteca estándar R (stat et al.) O en cualquiera de los paquetes disponibles en CRAN u otros repositorios. Utilicé el excelente paquete R sos para buscar, por lo que creo que los resultados devueltos fueron bastante exhaustivos.

Así que esa es la respuesta corta a la pregunta del OP: sin función incorporada o de paquete para tau-b o tau-c.

Pero es fácil hacer las suyas.

funciones de escritura R para las estadísticas Kendall es sólo una cuestión de la traducción de estas ecuaciones en código:

Kendall_tau_a = (P - Q)/(n*(n-1)/2) 

Kendall_tau_b = (P - Q)/((P + Q + Y0)*(P + Q + X0))^0.5 

Kendall_tau_c = (P-Q)*((2*m)/n^2*(m-1)) 

tau-a: igual a pares concordantes menos discordantes, dividido por un factor a tener en cuenta número total de pares (tamaño de muestra).

tau-b: contabilidad explícita para lazos --es decir, ambos miembros de la pareja de datos tienen el mismo valor; este valor es igual a pares concordantes menos discordantes divididos por un término que representa la media geométrica entre el número de pares no vinculados en x (X0) y el número no vinculado en y (Y0).

tau-c:de mayor tabla de variantes también optimizada para las tablas no cuadrados; igual a pares concordantes menos discordantes multiplicados por un factor que se ajusta para el tamaño de la tabla).

# number of concordant pairs 
P = function(t) { 
    r_ndx = row(t) 
    c_ndx = col(t) 
    sum(t * mapply(function(r, c){sum(t[(r_ndx > r) & (c_ndx > c)])}, 
    r = r_ndx, c = c_ndx))} 

# number of discordant pairs 
Q = function(t) { 
    r_ndx = row(t) 
    c_ndx = col(t) 
    sum(t * mapply(function(r, c){ 
     sum(t[(r_ndx > r) & (c_ndx < c)]) 
    }, 
    r = r_ndx, c = c_ndx)) 
} 

# sample size (total number of pairs) 
n = n = sum(t) 

# the lesser of number of rows or columns 
m = min(dim(t)) 

Así que estos cuatro parámetros son todo lo que necesita para calcular tau-a, tau-b y tau-c:

  • P

  • Q

  • m

  • n

(plus XO & Y0 para tau-b)


Por ejemplo, el código para tau-c es:

kendall_tau_c = function(t){ 
    t = as.matrix(t) 
    m = min(dim(t)) 
    n = sum(t) 
    ks_tauc = (m*2 * (P(t)-Q(t)))/((n^2)*(m-1)) 
} 

Entonces, ¿cómo son las estadísticas de tau de Kendall relacionados con las otras pruebas estadísticas utilizadas en el análisis de datos categóricos?

Los tres estadísticas de tau de Kendall, junto con gamma Kruskal de Goodman y de son para correlación de los datos ordinales y binarios. (Las estadísticas de tau de Kendall son alternativas más sofisticadas a la estadística gamma (solo P-Q).)

Y así tau de Kendalls y la gamma son homólogos a la sencilla chi-cuadrado y pruebas exactas de Fisher, ambos de los cuales son (como lo que sé) adecuado sólo para datos nominal.

ejemplo:

cpa_group = c(4, 2, 4, 3, 2, 2, 3, 2, 1, 5, 5, 1) 
revenue_per_customer_group = c(3, 3, 1, 3, 4, 4, 4, 3, 5, 3, 2, 2) 
weight = c(1, 3, 3, 2, 2, 4, 0, 4, 3, 0, 1, 1) 

dfx = data.frame(CPA=cpa_group, LCV=revenue_per_customer_group, freq=weight) 

# reshape data frame so 1 row for each event 
# (prediate step to create contingency table) 
dfx2 = data.frame(lapply(dfx, function(x){rep(x, dfx$freq)})) 

t = xtabs(~ revenue + cpa, dfx) 

kc = kendall_tau_c(t) 

# returns -.35 
2

¿Has probado la función cor? Hay un método que puede establecer en "kendall" (también opciones para "pearson" y "spearman" si es necesario), no estoy seguro de si eso cubre todos los errores estándar que está buscando, pero debe comenzar.

+4

-1: Esto no hace ninguna mención de Tau-b o Tau-c de Kendall, por lo que no responde la pregunta. – Firefeather

5

Solo para expandir la respuesta de Stedy ... cor(x,y,method="kendall") le dará la correlación, cor.test(x,y,method="kendall") le dará un valor de p e IC.

Además, eche un vistazo al paquete Kendall, que proporciona una función que asegura una mejor aproximación.

> library(Kendall) 
> Kendall(x,y) 

También existe la función cor.matrix en el paquete Deducer para la impresión agradable:

> library(Deducer) 
> cor.matrix(variables=d(mpg,hp,wt),, 
+ data=mtcars, 
+ test=cor.test, 
+ method='kendall', 
+ alternative="two.sided",exact=F) 

          Kendall's rank correlation tau       

      mpg  hp  wt  
mpg cor 1  -0.7428 -0.7278 
     N 32  32  32  
    stat**   -5.871 -5.798 
    p-value   0.0000 0.0000 
----------       
hp cor -0.7428 1  0.6113 
     N 32  32  32  
    stat** -5.871   4.845 
    p-value 0.0000   0.0000 
----------       
wt cor -0.7278 0.6113 1  
     N 32  32  32  
    stat** -5.798 4.845   
    p-value 0.0000 0.0000   
----------       
    ** z 
    HA: two.sided 
+4

-1: Esto no hace ninguna mención de Tau-b o Tau-c de Kendall, por lo que no responde la pregunta. – Firefeather

0

Hay una rutina para el coeficiente de Kendall en psych paquete con corr.test(x, method = "kendall"). Esta función se puede aplicar en data.frame, y también muestra p-values ​​ para cada par de variables. Supongo que muestra tau-a coeficiente. El único inconveniente es que en realidad es un contenedor para la función cor().

Wikipedia tiene good reference en el coeficiente de Kendall, y marque this link. Pruebe el paquete sos y la función findFn(). Obtuve muchas cosas al consultar "tau a" y tau b, pero ambas terminaron sin suerte. Y los resultados de búsqueda parecen fusionarse al paquete Kendall, como @Ian sugerido.

+0

@ Los comentarios de Firefeather en esta página indican que 'cor' calcula * tau-b *. –

2

encontré con este página de hoy en día, ya que estaba buscando para una implementación de Kendall tau-b en I
Para cualquier otra persona en busca de lo mismo:
tau b es, de hecho, parte del paquete de estadísticas.

Vea este enlace para más detalles: https://stat.ethz.ch/pipermail/r-help//2012-August/333656.html

Lo probé y funciona: biblioteca (Estadísticas)

x <- c(1,1,2) 
y<-c(1,2,3) 
cor.test(x, y, method = "kendall", alternative = "greater") 

Ésta es la salida:

data: x and y 
z = 1.2247, p-value = 0.1103 
alternative hypothesis: true tau is greater than 0 
sample estimates: 
     tau 
0.8164966 

Warning message: 
In cor.test.default(x, y, method = "kendall", alternative = "greater") : 
    Cannot compute exact p-value with ties 

simplemente ignorar el mensaje de advertencia. ¡El tau es, de hecho, tau b!

+1

De hecho, ambos 'cor.test (x, y, method =" kendall ")' y 'cor (x, y, method =" kendall ")' calculan el Tau-b de Kendall. – Firefeather

4

Hace un tiempo, pero las 3 funciones se implementan en DescTools.

library(DescTools) 
# example in: 
# http://support.sas.com/documentation/cdl/en/statugfreq/63124/PDF/default/statugfreq.pdf 
# pp. S. 1821 
tab <- as.table(rbind(c(26,26,23,18,9),c(6,7,9,14,23))) 

# tau-a 
KendallTauA(tab, conf.level=0.95) 
tau_a lwr.ci ups.ci 
0.2068323 0.1771300 0.2365346 

# tau-b 
KendallTauB(tab, conf.level=0.95) 
    tau_b lwr.ci ups.ci 
0.3372567 0.2114009 0.4631126 

# tau-c 
> StuartTauC(tab, conf.level=0.95) 
    tauc lwr.ci ups.ci 
0.4110953 0.2546754 0.5675151 

# alternative for tau-b: 
d.frm <- Untable(tab, dimnames = list(1:2, 1:5)) 
cor(as.numeric(d.frm$Var1), as.numeric(d.frm$Var2),method="kendall") 
[1] 0.3372567 

# but no confidence intervalls for tau-b! Check: 
unclass(cor.test(as.numeric(d.frm$Var1), as.numeric(d.frm$Var2), method="kendall")) 
3

La respuesta de Doug aquí es incorrecta. El paquete Kendall se puede usar para calcular Tau b.

El paquete de Kendall funciona Kendall (y también parece cor (x, y, method = "kendall")) calcular lazos usando la fórmula para Tau-b. Sin embargo, para vectores con vínculos, el paquete Kendall tiene el valor p más correcto. Véase la página 4 de la documentación para Kendall, desde https://cran.r-project.org/web/packages/Kendall/Kendall.pdf página 4, con referencia a la D denominador del cálculo Kendall:

y D = n (n - 1)/2. S se llama puntaje y D, el denominador, es el valor máximo posible de S. Cuando hay empates, la fórmula para D es más complicada (Kendall, 1974, Ch. 3) y esta forumla general para las ataduras en ambos reankings es implementado en nuestra función. El valor p de tau bajo la hipótesis nula de no asociación se computa en el caso de no lazos usando un algoritmo exacto dado por Best y Gipps (1974). Cuando hay lazos, se usa una aproximación normal con corrección de continuidad tomando S como distribuido normalmente con varío y varianza media (S), donde var (S) viene dado por Kendall (1976, eqn 4.4, p.55). A menos que los vínculos sean muy extensos y/o los datos sean muy cortos, esta aproximación es adecuada. Si existen vínculos extensos, entonces el bootstrap proporciona una solución conveniente (Davis y Hinkley, 1997). Alternativamente, también está disponible un método exacto basado en una enumeración exhaustiva (Valz y Thompson, 1994), pero esto no se implementa en este paquete.

Originalmente hice una edición de la respuesta de Doug con respecto a esto, pero fue rechazada por "ser dirigida al autor y más apropiada como respuesta o comentario".Hubiera dejado esto como un comentario sobre la respuesta, pero mi reputación aún no es lo suficientemente alta como para comentar.

0

He estado investigando un poco sobre la tau de Kendall. El uso directo de cor (x, y, method = "kendall") le dará la tau-b de Kendall, que es un poco diferente de la definición original, es decir, la tau-a de Kendall. La tau-b de Kendall se usa más comúnmente ya que tiene en cuenta los vínculos, por lo tanto, la mayoría de los paquetes de software disponibles (por ejemplo, cor(), Kendall()) calculan la tau-b de Kendall.

La diferencia entre tau-a y tau-b de Kendall es esencialmente el denominador. Específicamente, para la tau-a de Kendall, el denominador D = n * (n-1)/2, que es fijo, mientras que para la tau-b de Kendall, el denominador D = sqrt (pares n. De Var1 excluyendo pares atados) * sqrt (No. pares de Var2 excluyendo pares atados). El valor de tua-b suele ser mayor que tau-a.

Como un ejemplo simple, considere X = (1,2,3,4,4), Y = (2,3,4,4,4). Tau-b de Kendall = 0,88, mientras que tau-a = 0,7.

Para tau-c de Kendall, no vi demasiado, así que no hay comentarios.

Cuestiones relacionadas