如何使用R检验相关性等于给定值的假设?


10

是否有一个函数可以检验两个向量的相关性等于给定数字(例如0.75)的假设?使用cor.test可以测试cor = 0,可以看到0.75是否在置信区间内。但是是否有一个函数可以计算cor = 0.75的p值?

x <- rnorm(10)
y <- x+rnorm(10)
cor.test(x, y)

2
这个问题更适合
crossvalidated.com

1
@sacha-请先检查站点的FAQ,stats.se站点常见问题建议在SO上发布使用R的编程问题。
凯夫

问题“是否存在用于计算cor = 0.75的p值的函数?” 与编程无关。这是一个统计问题。
2011年

我将咨询统计人员,看看他们的想法。
凯夫

1
@mosaic请在这里注册您的帐户。这样,您将能够将您的SO帐户与当前帐户相关联。
chl

Answers:


12

使用稳定化Fisher的atan变换方差,可以得到p值,如下所示:

pnorm( 0.5 * log( (1+r)/(1-r) ), mean = 0.5 * log( (1+0.75)/(1-0.75) ), sd = 1/sqrt(n-3) )

或您感兴趣的任何一种版本的单侧/双侧p值。显然,您需要样本大小n和样本相关系数r作为输入。


+1感谢您的回答-在这种情况下,尚不清楚费舍尔(Fisher)转换是否合适,但我的回答并不明确,但您的回答有助于将其清除。
加文·辛普森

@Gavin,您试图澄清OP的意图。我只是假设会出现类似问题的模态情况,看起来好像已经解决了:)。
StasK,2011年

4

这个R函数由徐翠网页上的 Matlab代码改编而来,给出了r_hat在rho周围的分布。对于给定的样本量为“ n”且假设的真实值为“ ro”,将其转化为不可能出现的观测值“ r”的可能性的估计并不困难。

corrdist <- function (r, ro, n) {
        y = (n-2) * gamma(n-1) * (1-ro^2)^((n-1)/2) * (1-r^2)^((n-4)/2)
        y = y/ (sqrt(2*pi) * gamma(n-1/2) * (1-ro*r)^(n-3/2))
        y = y* (1+ 1/4*(ro*r+1)/(2*n-1) + 9/16*(ro*r+1)^2 / (2*n-1)/(2*n+1)) }

然后,使用该函数,您可以绘制零空rho的分布图0.75,计算r_hat小于0.6的概率,并在该图的该区域进行阴影处理:

 plot(seq(-1,1,.01), corrdist( seq(-1,1,.01), 0.75, 10) ,type="l")
 integrate(corrdist, lower=-1, upper=0.6, ro=0.75, n=10)
# 0.1819533 with absolute error < 2e-09
 polygon(x=c(seq(-1,0.6, length=100), 0.6, 0), 
         y=c(sapply(seq(-1,0.6, length=100), 
         corrdist, ro=0.75, n=10), 0,0), col="grey")

在此处输入图片说明


4

可视化测试是另一种方法,该方法可能不如费舍尔的转换精确,但我认为可能更直观(除统计意义外,还可以提供有关实际意义的想法):

 Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne,
 D.F and Wickham, H. (2009) Statistical Inference for exploratory
 data analysis and model diagnostics Phil. Trans. R. Soc. A 2009
 367, 4361-4383 doi: 10.1098/rsta.2009.0120

R vis.testTeachingDemos软件包中的函数中有此实现。为您的示例运行它的一种可能方法是:

vt.scattercor <- function(x,y,r,...,orig=TRUE)
{
    require('MASS')
    par(mar=c(2.5,2.5,1,1)+0.1)
    if(orig) {
        plot(x,y, xlab="", ylab="", ...)
    } else {
        mu <- c(mean(x), mean(y))
        var <- var( cbind(x,y) )
        var[ rbind( 1:2, 2:1 ) ] <- r * sqrt(var[1,1]*var[2,2])
        tmp <- mvrnorm( length(x), mu, var )
        plot( tmp[,1], tmp[,2], xlab="", ylab="", ...)
    }
}

test1 <- mvrnorm(100, c(0,0), rbind( c(1,.75), c(.75,1) ) )
test2 <- mvrnorm(100, c(0,0), rbind( c(1,.5), c(.5,1) ) )

vis.test( test1[,1], test1[,2], r=0.75, FUN=vt.scattercor )
vis.test( test2[,1], test2[,2], r=0.75, FUN=vt.scattercor )

当然,如果您的真实数据不正常或关系不是线性的,则可以通过上面的代码轻松获取。如果要同时测试这些内容,则可以使用上面的代码,或者可以对上面的代码进行修改以更好地表示数据的性质。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.