Как проверить гипотезу, что корреляция равна заданному значению, используя R?


10

Есть ли функция для проверки гипотезы, что корреляция двух векторов равна заданному числу, скажем, 0,75? Используя cor.test, я могу проверить cor = 0 и посмотреть, находится ли 0,75 внутри доверительного интервала. Но есть ли функция для вычисления значения p для cor = 0,75?

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

2
Этот вопрос лучше подходит для crossvalidated.com
Sacha Epskamp

1
@sacha - пожалуйста, сначала проверьте FAQ сайта, сайт stats.se faq рекомендует размещать вопросы по программированию на R на SO.
Кев

Вопрос "есть ли функция для вычисления p-значения для cor = 0,75?" не имеет ничего общего с программированием. Это статистический вопрос.
Саша Эпскамп,

Я проконсультируюсь со статистиками и посмотрю, что они думают.
Кев

1
@mosaic Пожалуйста, зарегистрируйтесь здесь. Таким образом, вы сможете связать свою учетную запись SO с существующей.
chl

Ответы:


12

Используя дисперсию, стабилизирующую атановое преобразование Фишера , вы можете получить значение 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 Спасибо за ваш ответ - мне не было ясно, что преобразование Фишера было уместным или нет в этом случае, но ваш ответ помогает прояснить это.
Гэвин Симпсон

@ Гэвин, ты пытался уточнить, каково было намерение ОП. Я просто предположил модальную ситуацию, в которой возник бы такой вопрос, и похоже, что он сработал :).
StasK

4

Распределение r_hat вокруг rho задается этой R-функцией, адаптированной из кода Matlab на веб-странице Xu Cui . Не так сложно превратить это в оценку вероятности того, что наблюдаемое значение «r» маловероятно, учитывая размер выборки «n» и гипотетическое истинное значение «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)) }

Затем с помощью этой функции вы можете построить распределение нулевого 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

Существует реализация этого в vis.testфункции в TeachingDemosпакете для R. Один из возможных способов запустить его для вашего примера:

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 )

Конечно, если ваши реальные данные не нормальны или отношения не линейны, то это будет легко подобрать с помощью приведенного выше кода. Если вы хотите провести одновременное тестирование для них, то вышеприведенный код сделает это, или приведенный выше код может быть адаптирован для лучшего представления характера данных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.