Меры ассоциации в R - Тау-б Кендалла и тау-с - PullRequest
16 голосов
/ 01 апреля 2010

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

Ответы [ 9 ]

39 голосов
/ 02 апреля 2010

Есть три Кендалла Тау статистика ( Тау-а , Тау-б и Тау-с ).

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

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

Итак, вот краткий ответ на вопрос ОП: нет встроенной функции или функции Package для 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-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))

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

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

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

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

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

пример:

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 
# (predicate 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.
8 голосов
/ 26 мая 2015

Довольно давно, но в DescTools реализованы 3 функции.

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"))
5 голосов
/ 01 апреля 2010

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

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

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

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

> 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 
3 голосов
/ 28 июля 2015

Ответ Дуга здесь неправильный. Пакет Кендалла можно использовать для расчета Тау б.

Функция пакета Kendall Kendall (и, казалось бы, cor (x, y, method = "kendall")) вычисляет связи, используя формулу для Tau-b. Однако для векторов со связями пакет Кендалла имеет более правильное значение 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 и Gipps (1974). При наличии связей используется нормальное приближение с коррекцией непрерывности, принимая S как нормально распределенное со средним нулем и дисперсией var (S), где var (S) задается Кендаллом (1976, уравнение 4.4, с.55). Если связи не очень обширные и / или данные не очень короткие, это приближение является адекватным. Если присутствуют обширные связи, то бутстрап дает подходящее решение (Davis and Hinkley, 1997). В качестве альтернативы также доступен точный метод, основанный на исчерпывающем перечислении (Valz and Thompson, 1994), но он не реализован в этом пакете.

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

3 голосов
/ 05 января 2014

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

Смотрите эту ссылку для более подробной информации: 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

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

2 голосов
/ 01 апреля 2010

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

0 голосов
/ 26 июня 2017

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

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

В качестве простого примера рассмотрим X = (1,2,3,4,4), Y = (2,3,4,4,4). Тау-б Кендалла = 0,88, а тау-а = 0,7.

Что касается тау-к Кендалла, я не видел на ней слишком много, так что никаких комментариев.

0 голосов
/ 30 мая 2015

Согласно этой странице r-tutor http://www.r -tutor.com / gpu-computing / correlation / kendall-tau-b tau-b фактически вычисляется с помощью базовой функции r.

0 голосов
/ 01 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...