Меры ассоциации в R - Kendall tau-b и tau-c

Существуют ли какие-либо R-пакеты для расчета Kendall tau-b и tau-c и связанные с ними стандартные ошибки? Мои поиски в Google и Rseek ничего не показали, но, конечно же, кто-то их реализовал в R.

Ответы

Ответ 1

Существует три статистики Kendal tau (tau-a, tau-b и tau-c).

Они не взаимозаменяемы, и ни один из ответов, опубликованных до сих пор, не касается последних двух, которые являются предметом вопроса OP.

Мне не удалось найти функции для вычисления tau-b или tau-c, либо в R Standard Library (stat et al.), либо в любом из пакетов, доступных в CRAN или других репозиториях. Я использовал отличный R-пакет sos для поиска, поэтому верю, что полученные результаты были достаточно тщательными.

Итак, короткий ответ на вопрос OP: нет встроенной или функции пакета для tau-b или tau-c.

Но легко сворачивать свои собственные.

Написание R-функций для статистики Кендалла - это просто вопрос перевод этих уравнений в код:

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:, равный согласованным минусам несогласных пар, деленный на коэффициент для учета общего количества пар (размер выборки).

tau-b: явный учет связей - т.е. оба члена пары данных имеют одинаковое значение; это значение равно согласованным минусам дискордантных пар, деленным на член, представляющий среднее геометрическое между числом пар, не связанным с x (X0), и числом, не связанным с y (Y0).

tau-c: вариант с большим столом также оптимизирован для неквадратных таблиц; равный согласованным минус несогласованным парам, умноженным на коэффициент, который настраивается для размера таблицы).

# 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))

Итак, эти четыре параметра - все, что вам нужно для вычисления tau-a, tau-b и tau-c:

  • P

  • Q

  • т

  • п

(плюс XO и Y0 для tau-b)


Например, код для tau-c:

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))
}

Итак, как статистика Kendall tau связана с другими статистическими критериями, используемыми при анализе категориальных данных?

Все три статистики Kendall tau, наряду с гаммами Гудмана и Крускаля, для корреляции порядковых и двоичных данных. (Статистика Kendall tau - более сложные альтернативы гамма-статистике (только P-Q).)

И поэтому Kendalls tau и гамма являются аналогами простых хи-квадратов и точных тестов Фишера, оба из которых (насколько я знаю) подходят только для номинальных данных.

Пример:

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

Просто для расширения ответа Stedy... cor(x,y,method="kendall") даст вам корреляцию, cor.test(x,y,method="kendall") даст вам значение p и CI.

Кроме того, взгляните на пакет Kendall, который обеспечивает функцию, которая требует лучшего приближения.

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

Существует также функция cor.matrix в пакете Deducer для приятной печати:

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

                          Kendall 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 

Ответ 3

Довольно давно, но три функции реализованы в 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"))

Ответ 4

Даг ответ здесь неверен. Пакет Kendall можно использовать для расчета Tau b.

Функция пакета Kendall Kendall (и она также казалась бы cor (x, y, method = "kendall" )) вычисляет связи, используя формулу для Tau-b. Однако для векторов со связями пакет Kendall имеет более правильное значение p. См. Стр. 4 документации для Kendall, от https://cran.r-project.org/web/packages/Kendall/Kendall.pdf страница 4, где D ссылается на знаменатель вычисления Кендалла:

и D = n (n - 1)/2. S называется оценкой, а D, знаменателем, является максимально возможным значением S. Когда существуют связи, формула для D более сложна (Kendall, 1974, Ch. 3), и этот общий форум для связей в обеих окнах реализованной в нашей функции. p-значение tau при нулевой гипотезе без ассоциации вычисляется в случае отсутствия связей с использованием точного алгоритма, данного Best and Gipps (1974). При наличии связей нормальное приближение с коррекцией непрерывности используется, если считать, что S обычно распределяется со средним нулем и дисперсией var (S), где var (S) задается Kendall (1976, 4.4, с .55). Если связи не очень обширны и/или данные очень короткие, это приближение является адекватным. Если присутствуют обширные связи, то бутстрап обеспечивает подходящее решение (Davis and Hinkley, 1997). В качестве альтернативы также доступен точный метод, основанный на исчерпывающей перечислении (Valz and Thompson, 1994), но это не реализовано в этом пакете.

Я изначально редактировал ответ Дуга в отношении этого, но он был отклонен за то, что "был направлен на автора и более уместен как ответ или комментарий". Я бы оставил это как комментарий к ответу, но моя репутация еще недостаточно высока, чтобы комментировать.

Ответ 5

Вы пробовали функцию cor? Существует способ, которым вы можете установить "kendall" (также параметры для "pearson" и "spearman", если это необходимо), не уверен, что он охватывает все стандартные ошибки, которые вы ищете, но он должен начать работу.

Ответ 6

Сегодня наткнулся на эту страницу, так как я искал реализацию kendall tau-b в R Для тех, кто ищет то же самое:
tau-b на самом деле является частью пакета статистики.

См. эту ссылку для получения более подробной информации: https://stat.ethz.ch/pipermail/r-help//2012-August/333656.html

Я попробовал, и он работает: Библиотека (статистика)

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

это результат:

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

Просто игнорируйте предупреждающий месседж. Тау на самом деле тау б!!!

Ответ 7

Там есть программа для коэффициента Кендалла в пакете psych с corr.test(x, method = "kendall"). Эта функция может применяться к data.frame, а также отображает значения p для каждой пары переменных. Я предполагаю, что он отображает коэффициент tau-a. Единственным недостатком является то, что на самом деле это оболочка для функции cor().

Википедия хорошая ссылка по коэффициенту Кендалла и проверите this ссылка. Попробуйте sos пакет и findFn() функцию. Я получил кучу вещей при запросе "tau a" и tau b, но оба закончились неудачей. И результаты поиска, похоже, сливаются с пакетом Kendall, поскольку предлагается @Ian.

Ответ 9

Я немного разбираюсь в Kendall tau. Прямо используя cor (x, y, method = "kendall" ) даст вам Kendall tau-b, который немного отличается от исходного определения, т.е. Kendall tau-a. Kendall tau-b чаще используется, поскольку он учитывает связи, поэтому большинство доступных пакетов программного обеспечения (например, cor(), Kendall()) все вычисляют Kendall tau-b.

Разница между Kendall tau-a и tau-b по существу является знаменателем. В частности, для Kendall tau-a знаменатель D = n * (n-1)/2, который фиксирован, тогда как для Kendall tau-b знаменатель D = sqrt (пары № Var1, исключая связанные пары) * sqrt (Пары пар Var2, исключая связанные пары). Значение tua-b обычно больше, чем tau-a.

В качестве простого примера рассмотрим X = (1,2,3,4,4), Y = (2,3,4,4,4). Kendall tau-b = 0,88, тогда как tau-a = 0,7.

Для Kendall tau-c я не видел слишком много, поэтому никаких комментариев.