Exemple de fort coefficient de corrélation avec une valeur p élevée


21

Je me demandais, est-il possible d'avoir un très fort coefficient de corrélation (disons .9 ou plus), avec une valeur p élevée (disons .25 ou plus)?

Voici un exemple d'un faible coefficient de corrélation, avec une valeur p élevée:

set.seed(10)
y <- rnorm(100)
x <- rnorm(100)+.1*y
cor.test(x,y)

cor = 0,03908927, p = 0,6994

Coefficient de corrélation élevé, valeur p faible:

y <- rnorm(100)
x <- rnorm(100)+2*y
cor.test(x,y)

cor = 0,8807809, p = 2,2e-16

Faible coefficient de corrélation, faible valeur p:

y <- rnorm(100000)
x <- rnorm(100000)+.1*y
cor.test(x,y)

cor = 0,1035018, p = 2,2e-16

Coefficient de corrélation élevé, valeur p élevée: ???

Réponses:


36

The Bottom Line

Le coefficient de corrélation de l'échantillon nécessaire pour rejeter l'hypothèse selon laquelle le véritable coefficient de corrélation (Pearson) est nul devient petit assez rapidement à mesure que la taille de l'échantillon augmente. Donc, en général, non, vous ne pouvez pas avoir en même temps un grand (en amplitude) coefficient de corrélation et simultanément grande -valuep .

The Top Line (Détails)

Le test utilisé pour le coefficient de corrélation de Pearson dans la fonction est une version très légèrement modifiée de la méthode décrite ci-dessous.Rcor.test

Supposons que sont des vecteurs aléatoires normaux bivariés iid avec corrélation ρ . Nous voulons tester l'hypothèse nulle que ρ = 0 contre ρ 0 . Soit r le coefficient de corrélation de l'échantillon. En utilisant la théorie standard de régression linéaire, il n'est pas difficile de montrer que la statistique de test, T = r (X1,Y1),(X2,Y2),,(Xn,Yn)ρρ=0ρ0r a unedistributiontn-2sous l'hypothèse nulle. Pour les grandsn, ladistributiontn-2s'approche de la normale standard. Par conséquent,T2est approximativement khi carré distribué avec un degré de liberté. (Selon les hypothèses que nous avons faites,T2F1,n-2en réalité, mais l'approximationχ21rend plus clair ce qui se passe, je pense.)

T=rn2(1r2)
tn2ntn2T2T2F1,n2χ12

Donc, q 1 - α est lequantile ( 1 - α ) d'une distribution chi carré avec un degré de liberté.

P(r21r2(n2)q1α)α,
q1-α(1-α)

Maintenant, notez que augmente à mesure que r 2 augmente. Réorganiser la quantité dans l'énoncé de probabilité, nous avons cela pour tous | r | 1r2/(1-r2)r2 nous obtiendrons un rejet de l'hypothèse nulle au niveauα. Clairement, le côté droit diminue avecn.

|r|11+(n-2)/q1-α
αn

Un terrain

Voici un tracé de la région de rejet de en fonction de la taille de l'échantillon. Ainsi, par exemple, lorsque la taille de l'échantillon dépasse 100, la corrélation (absolue) ne doit être que d'environ 0,2 pour rejeter le zéro au niveau α = 0,05 .|r|α=0.05

Une simulation

Nous pouvons faire une simulation simple pour générer une paire de vecteurs à moyenne nulle avec un coefficient de corrélation exact . Voici le code. De cela, nous pouvons regarder la sortie de cor.test.

k <- 100
n <- 4*k

# Correlation that gives an approximate p-value of 0.05
# Change 0.05 to some other desired p-value to get a different curve
pval <- 0.05
qval <- qchisq(pval,1,lower.tail=F)
rho  <- 1/sqrt(1+(n-2)/qval)

# Zero-mean orthogonal basis vectors
b1 <- rep(c(1,-1),n/2)
b2 <- rep(c(1,1,-1,-1),n/4)

# Construct x and y vectors with mean zero and an empirical
# correlation of *exactly* rho
x <- b1
y <- rho * b1 + sqrt(1-rho^2) * b2

# Do test
ctst <- cor.test(x,y)

Comme demandé dans les commentaires, voici le code pour reproduire le tracé, qui peut être exécuté immédiatement après le code ci-dessus (et utilise certaines des variables définies ici).

png("cortest.png", height=600, width=600)
m  <- 3:1000
yy <- 1/sqrt(1+(m-2)/qval)
plot(m, yy, type="l", lwd=3, ylim=c(0,1),
     xlab="sample size", ylab="correlation")
polygon( c(m[1],m,rev(m)[1]), c(1,yy,1), col="lightblue2", border=NA)
lines(m,yy,lwd=2)
text(500, 0.5, "p < 0.05", cex=1.5 )
dev.off()

1
Alors - quel est le résultat? Je pense que vous dites que, à moins que la taille de l'échantillon ne soit petite, une valeur de corrélation élevée implique une valeur p faible - mais je pense que cela aiderait à le préciser explicitement.
DW

p

@cardinal, pouvez-vous, s'il vous plaît, publier le code source du graphique que vous avez généré?
aL3xa

@DW, j'ai tenté de répondre à vos préoccupations. Si vous voyez des améliorations qui peuvent être apportées, faites-le moi savoir.
cardinal

1
@ aL3xa: J'ai ajouté le code de traçage que j'ai utilisé. J'espère que cela t'aides.
cardinal


11

Une estimation élevée du coefficient de corrélation avec une valeur de p élevée ne pouvait se produire qu'avec une très petite taille d'échantillon. J'étais sur le point de fournir une illustration, mais Aaron vient de le faire!


9

1/n3ρ^>0p

p=22Φ(atanh(ρ^)n3),
ΦH0:ρ=0

nρ^p

 #get n for sample correlation and p-value, 2-sided test of 0 correlation
 n.size <- function(rho.hat,p.val) {
   n <- 3 + ((qnorm(1 - 0.5 * p.val)) / atanh(rho.hat))^2
 }

ρ^=0.5p=0.2

print(n.size(0.5,0.2))

[1] 8.443062

n,pρ^


1

Oui. Une valeur de p dépend de la taille de l'échantillon, donc un petit échantillon peut donner cela.

Supposons que la taille réelle de l'effet était très petite et que vous dessinez un petit échantillon. Par chance, vous obtenez quelques points de données avec une très forte corrélation. La valeur de p sera élevée, comme il se doit. La corrélation est élevée mais ce n'est pas un résultat très fiable.

La corrélation d'échantillon de cor () de R vous indiquera la meilleure estimation de la corrélation (compte tenu de l'échantillon). La valeur de p ne mesure PAS la force de la corrélation. Il mesure la probabilité que cela se soit produit en l'absence d'effet, compte tenu de la taille de l'échantillon.

Une autre façon de voir cela: si vous avez la même taille d'effet, mais obtenez plus d'échantillons, la valeur de p va toujours à zéro.

(Si vous souhaitez intégrer plus étroitement les notions de taille d'effet estimée et de confiance à l'égard de l'estimation, il peut être préférable d'utiliser des intervalles de confiance; ou, utilisez des techniques bayésiennes.)


α=0.05x <- seq(0,4); y <- seq(0,4) + rnorm(5); cor.test(x,y)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.