R - Kendall的tau-b和tau-c中的关联度量

时间:2010-04-01 02:51:16

标签: r statistics distribution

是否有任何R软件包用于计算Kendall的tau-b和tau-c及其相关的标准错误?我在Google和Rseek上的搜索结果都没有,但肯定有人在R中实现了这些。

9 个答案:

答案 0 :(得分:39)

三个 Kendall tau统计数据 tau -a tau-b tau蛋白-C )。

他们可以互换,到目前为止发布的答案都没有涉及最后两个,这是OP问题的主题。

我无法在R 标准库 stat et al 。)或任何一个中找到计算tau-b或tau-c的函数。 CRAN或其他存储库上提供的软件包。我使用优秀的R包 sos 进行搜索,所以我相信返回的结果是相当彻底的。

这是对OP问题的简短回答: tau-b或tau-c没有内置或包功能

但你可以轻松推出自己的。

为Kendall统计编写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:显式核算 tie - 即,数据对的两个成员具有相同的值;此值等于一致的负不一致对除以一个项,表示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

  • <强>米

  • <强>名词

(加上 XO &amp; 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统计数据,以及Goodman和Kruskal的 gamma 都用于序数和二进制数据的相关性。 (Kendall tau统计数据是伽马统计量的更复杂的替代方案(只是P-Q)。)

因此Kendalls的 tau gamma 与简单的卡方 Fisher精确测试相对应,据我所知,两者都只适用于名义数据

示例:

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.

答案 1 :(得分:8)

很长一段时间,但这三个函数是在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"))

答案 2 :(得分:5)

只是为了扩展Stedy的答案...... 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 :(得分:3)

道格的回答不正确。 包Kendall可用于计算Tau b。

Kendall包函数Kendall(它也似乎是cor(x,y,method =“kendall”))使用Tau-b的公式计算联系。但是,对于具有关系的矢量,Kendall包具有更正确的p值。参见Kendall文档的第4页,来自https://cran.r-project.org/web/packages/Kendall/Kendall.pdf第4页,其中D引用了Kendall计算的分母:

  

且D = n(n-1)/ 2。 S称为得分,D,分母,是S的最大可能值。当存在关系时,D的公式更复杂(Kendall,1974,Ch.3),这两个关系中的关系的一般论坛是在我们的函数中实现。在没有关联的零假设下,tau的p值是在没有关联的情况下使用Best和Gipps给出的精确算法计算的(1974)。当存在联系时,通过将S作为正态分布,使用平均零和方差var(S)来使用具有连续性校正的正态近似,其中var(S)由Kenndall(1976,eqn 4.4,p.55)给出。除非关系非常广泛和/或数据非常短,否则这种近似就足够了。如果存在广泛的联系,则引导程序提供了一种权宜之计(Davis和Hinkley,1997)。另外,也可以使用基于详尽枚举的精确方法(Valz和Thompson,1994),但这个方法没有实现。

我最初对Doug的答案进行了编辑,但是因为“针对作者而更适合作为答案或评论”而被拒绝了。我会留下这个作为对答案的评论,但我的声誉还不足以发表评论。

答案 4 :(得分:2)

您是否尝试过cor功能?有一种方法可以设置为"kendall"(如果需要,还可以设置"pearson""spearman"的选项),不确定是否涵盖了您要查找的所有标准错误但它应该可以帮到您启动。

答案 5 :(得分:2)

今天偶然发现了这个页面,因为我正在寻找在R中实现kendall tau-b的方法 对于寻找同样事物的其他人:
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

忽略警告信息。 tau实际上是tau b !!!

答案 6 :(得分:0)

psych包裹中的corr.test(x, method = "kendall")包含Kendall系数的例程。此函数可应用于data.frame,还可为每对变量显示 p-values 。我猜它会显示 tau-a 系数。唯一的缺点是它实际上是cor()函数的包装器。

维基百科对肯德尔的系数有good reference,并检查this link。试试sos包和findFn()功能。在查询"tau a"tau b时,我收到了很多东西,但两者都没有运气。搜索结果似乎与Kendall包合并,如 @Ian 所示。

答案 7 :(得分:0)

根据这个r-tutor页面http://www.r-tutor.com/gpu-computing/correlation/kendall-tau-b tau-b实际上是由base r函数计算的。

答案 8 :(得分:0)

我一直在研究Kendall的tau。直接使用cor(x,y,method =“kendall”)会给你Kendall的tau-b,它与原始定义略有不同,即Kendall的tau-a。 Kendall的tau-b更常用,因为它考虑了关系,因此,大多数可用的软件包(例如cor(),Kendall())都计算Kendall的tau-b。

肯德尔的tau-a和tau-b之间的区别主要是分母。具体来说,对于Kendall的tau-a,分母D = n *(n-1)/ 2,这是固定的,而对于Kendall的tau-b,分母D = sqrt(No。对Var1除了绑定对)* sqrt (不包括绑定对的Var2对号)。 tua-b的值通常大于tau-a。

作为一个简单的例子,考虑X =(1,2,3,4,4),Y =(2,3,4,4,4)。肯德尔的tau-b = 0.88,而tau-a = 0.7。

对于Kendall的tau-c,我没有看到太多,所以没有评论。