Como testar a hipótese de que a correlação é igual ao valor fornecido usando R?

10

Existe uma função para testar a hipótese de que a correlação de dois vetores é igual a um determinado número, digamos 0,75? Usando cor.test, posso testar cor = 0 e ver se 0,75 está dentro do intervalo de confiança. Mas existe uma função para calcular o valor de p para cor = 0,75?

x <- rnorm(10)
y <- x+rnorm(10)
cor.test(x, y)
mosaico
fonte
2
Esta pergunta é mais adequada para crossvalidated.com
Sacha Epskamp 13/08
11
@sacha - verifique primeiro as perguntas frequentes de um site, o FAQ do site stats.se recomenda que as questões de programação usando R sejam postadas no SO.
Kev
A pergunta "existe uma função para calcular o valor de p para cor = 0,75?" não tem nada a ver com programação. É uma questão estatística.
Sacha Epskamp
Vou consultar o pessoal das estatísticas e ver o que eles pensam.
Kev
11
@mosaic Por favor, registre sua conta aqui. Dessa forma, você poderá associar sua conta SO à presente.
chl

Respostas:

12

Usando a variância que estabiliza a transformação de Fisher , você pode obter o valor p como

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

ou qualquer versão do valor-p unilateral / frente e verso de seu interesse. Obviamente, você precisa do tamanho nda amostra e do coeficiente de correlação da amostra rcomo entradas para isso.

StasK
fonte
+1 Obrigado pela sua resposta - Não estava claro para mim que a transformação Fisher era apropriada ou não neste caso, mas sua resposta ajuda a esclarecer isso.
Gavin Simpson
@ Gavin, você tentou esclarecer qual era a intenção do OP. Eu apenas assumi a situação modal em que uma pergunta como essa surgiria, e parece que deu certo :).
StasK 13/08/11
4

A distribuição de r_hat em torno de rho é dada por essa função R adaptada do código Matlab na página de Xu Cui . Não é tão difícil transformar isso em uma estimativa para a probabilidade de um valor observado "r" ser improvável, dado um tamanho de amostra de "n" e um valor verdadeiro hipotético de "ro".

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

Então, com essa função, você pode plotar a distribuição de um rho nulo de 0,75, calcular a probabilidade de r_hat ser menor que 0,6 e sombrear nessa área no gráfico:

 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")

insira a descrição da imagem aqui

DWin
fonte
4

Outra abordagem que pode ser menos exata que a transformação de Fisher, mas acho que poderia ser mais intuitiva (e poderia dar idéias sobre significado prático além do significado estatístico) é o teste visual:

 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

Existe uma implementação disso na vis.testfunção no TeachingDemospacote para R. Uma maneira possível de executá-lo para o seu exemplo é:

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 )

Obviamente, se seus dados reais não são normais ou o relacionamento não é linear, isso será facilmente captado com o código acima. Se você quiser testar esses itens simultaneamente, o código acima faria isso ou o código acima poderá ser adaptado para representar melhor a natureza dos dados.

Greg Snow
fonte