好久没有更新了,最近都在忙数据分析,对于代码的编写时间变少了。今天更一个关于《R语言实战》书中代码结果不一致的问题。
在《R语言实战(第2版)》p144-145中,有一个利用vcd包中assocstats()函数计算相关性的问题,我们先看看书中如何描述:
根据书中的实例代码,我们重新跑一下试试看:
> library(vcd)
> data <- xtabs(~Treatment+Improved,data = Arthritis)
> assocstats(data)
X^2 df P(> X^2)
Likelihood Ratio 13.530 2 0.0011536
Pearson 13.055 2 0.0014626
Phi-Coefficient : NA
Contingency Coeff.: 0.367
Cramer's V : 0.394
> #我们注意到 Phi-Coefficient 这个值同实例数据产生了产别,即便代码都是一样的。
那么为什么会产生这个问题呢?我们扒一下源码看看
> assocstats
function (x)
{
if (!is.matrix(x)) {
l <- length(dim(x))
str <- apply(x, 3:l, FUN = assocstats)
if (l == 3) {
names(str) <- paste(names(dimnames(x))[3], names(str),
sep = ":")
}
else {
dn <- dimnames(str)
dim(str) <- NULL
names(str) <- apply(expand.grid(dn), 1, function(x) paste(names(dn),
x, sep = ":", collapse = "|"))
}
return(str)
}
tab <- summary(loglm(~1 + 2, x))$tests
phi <- sqrt(tab[2, 1]/sum(x))
cont <- sqrt(phi^2/(1 + phi^2))
cramer <- sqrt(phi^2/min(dim(x) - 1))
#我们发现在这里是否输出phi值进行了判断,当dall(dim(x) == 2L时,才会输出phi值
#也就是都是二维变量的时候才会输出,详见Phi-Coefficient的阐述。
structure(list(table = x, chisq_tests = tab, phi = ifelse(all(dim(x) ==
2L), phi, NA), contingency = cont, cramer = cramer),
class = "assocstats")
}
<bytecode: 0x000002bdb48566e0>
<environment: namespace:vcd>
造成这个结果差异的 原因可能是由于书编写的时候函数还未更新吧:)
哪些都不重要,重要的是理解为什么会输出NA:)
源码放在这里啦,Phi-Coefficient具体是如何计算出来的,可以自己用源码去试试~