Меры ассоциации в 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:
(плюс 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.
Ответ 8
Согласно этой странице r-tutor http://www.r-tutor.com/gpu-computing/correlation/kendall-tau-b tau-b фактически вычисляется базовой функцией r.
Ответ 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 я не видел слишком много, поэтому никаких комментариев.