Як перевірити гіпотезу, що кореляція дорівнює заданій величині за допомогою R?


10

Чи є функція перевірки гіпотези про те, що співвідношення двох векторів дорівнює заданому числу, скажімо, 0,75? Використовуючи cor.test, я можу перевірити cor = 0, і я можу побачити, чи 0,75 знаходиться в довірчому інтервалі. Але чи є функція для обчислення р-значення для cor = 0,75?

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

2
Це питання краще підійде для crossvalidated.com
Sacha Epskamp

1
@sacha - спочатку ознайомтеся з поширеними запитаннями сайту, fats.se сайту faq рекомендує, щоб питання програмування за допомогою R розміщувались на SO.
Кев

Питання "чи існує функція для обчислення р-значення для cor = 0,75?" не має нічого спільного з програмуванням. Це статистичне питання.
Sacha Epskamp

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

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

або будь-яка версія однобічного / двостороннього р-значення, яке вас цікавить. Obviuosly, вам потрібен розмір вибірки nта коефіцієнт кореляції вибірки rяк вхідні дані.


+1 Дякую за вашу відповідь - Мені було не зрозуміло, що перетворення Фішера є відповідним чи ні в цьому випадку, але ваша відповідь допомагає зрозуміти це.
Гевін Сімпсон

@Gavin, ти спробував уточнити, який був задум ОП. Я просто припустив модальну ситуацію, в якій виникне таке питання, і це виглядає так, ніби воно спрацювало :).
Стаск

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.