我想确定两组数据(B1,B2)中的哪一组与另一组(A)更好地相关(皮尔森r)。所有数据集中都缺少数据。如何确定所得的相关性是否显着不同?
例如,在A和B1中都存在8426值,r = 0.74。A和B2中都存在8798,r = 0.72。
我认为这个问题可能会有所帮助,但尚未得到答案:如何知道一个系统明显优于另一个系统?
我想确定两组数据(B1,B2)中的哪一组与另一组(A)更好地相关(皮尔森r)。所有数据集中都缺少数据。如何确定所得的相关性是否显着不同?
例如,在A和B1中都存在8426值,r = 0.74。A和B2中都存在8798,r = 0.72。
我认为这个问题可能会有所帮助,但尚未得到答案:如何知道一个系统明显优于另一个系统?
Answers:
有时候,一个也许能够在多元回归,其中A是DV做到这一点,B是分数的人有上规模,C是一个伪代码,说,这是无论是B1或B2: lm(A~B+C+B*C)
。交互作用项B*C
会告诉您相关性是否不同,而在C的两个水平处A和B之间的简单斜率也会告诉您相关性。
但是,不可能在此框架中进行条件之间所有类型的比较。在cocor
[R包是非常有用的,它有一个非常简单的在网络上的指向和点击界面。请注意,由于缺少不同的数据,因此您既没有独立样本也没有从属样本。我将在此处使用按列表删除,以使其保持简单(并且电源对您而言不是问题)。
目的是确定这两个数据集的相关性是否显着不同。通过像这样获取引导程序样本:
B <- 10000
cor1 <- cor2 <- rep(0, B)
for(i in 1:B){
samp <- sample(n, n, TRUE)
cor1[i] <- cor(A[samp], B1[samp])
cor2[i] <- cor(A[samp], B2[samp])
}
我们还可以获得 95%置信区间。
95%CI为:
95%CI为:
间隔不重叠(几乎不重叠)的事实为我们提供了一些证据,表明我们观察到的样本相关性差异确实具有统计学意义。
正如变形虫在评论中指出的那样,获得每个引导程序样本的差异会带来更“强大”的结果。
对于这两者之间的差A 95%CI是:
注意间隔(几乎)不包括0,我们有和以前类似的证据。
要处理丢失的数据问题,只需从两个数据集中包含的对中选择引导程序样本。
假定Fisher变换:和- [R ' 2 = 的tanh - 1 (- [R 2 )。或者,以一种等效且也许更清晰的方式(感谢@dbwilson!),r ′
然后得出的结论是,由于Fisher变量现在正态分布,而正态分布随机变量之和仍然正态分布:
-
@Josh发表评论后,我们可以在某种程度上纳入样本之间相互依赖的可能性(请记住,两个相关性均取决于A的分布)。如果不假设独立样本,也无需使用Cauchy-Schwarz不等式,则可以得到以下上限(请参阅:如何找到两个均值之差的标准偏差?):
根据Mark White的有用反馈进行编辑(谢谢!)
一种选择是在单个模型中计算两个关系(B1与A,B2与A),该模型还估计它们之间的差异。使用多元回归很容易做到这一点。您将运行一个模型,其中A为因变量,然后运行一个连续变量,其中包含B1和B2的所有得分,分类变量(指示变量是哪个变量)(B1或B2)以及它们之间的相互作用。在r中:
> set.seed(24601)
>
> library(tidyverse)
> library(mvtnorm)
> cov <- matrix(c(1, .4, .16,.4, 1, .4, .16, .4, 1), ncol=3, byrow=TRUE)
> mydata <- rmvnorm(n=100, sigma = cov)
> colnames(mydata) = c("A", "B1", "B2")
> head(mydata)
A B1 B2
[1,] -0.1046382 0.6031253 0.5641158
[2,] -1.9303293 -0.7663828 -0.7921836
[3,] 0.1244192 -0.4413581 -1.2376256
[4,] -3.2822601 -1.2512055 -0.5586773
[5,] -0.9543368 -0.1743740 1.1884185
[6,] -0.4843183 -0.2612668 -0.7161938
以下是我生成的数据的相关性:
> cor(mydata)
A B1 B2
A 1.0000000 0.4726093 0.3043496
B1 0.4726093 1.0000000 0.3779376
B2 0.3043496 0.3779376 1.0000000
>
更改数据格式以满足模型的需要(重新格式化为“ long”):
> mydata <- as.data.frame(mydata) %>%
+ gather("var", "value", B1, B2)
>
这是模型:
摘要(lm(A〜value * var,data = mydata))
Call:
lm(formula = A ~ value * var, data = mydata)
Residuals:
Min 1Q Median 3Q Max
-2.89310 -0.52638 0.02998 0.64424 2.85747
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.09699 0.09014 -1.076 0.283
value 0.47445 0.09305 5.099 8.03e-07 ***
varB2 -0.10117 0.12711 -0.796 0.427
value:varB2 -0.13256 0.13965 -0.949 0.344
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.891 on 196 degrees of freedom
Multiple R-squared: 0.158, Adjusted R-squared: 0.1451
F-statistic: 12.26 on 3 and 196 DF, p-value: 2.194e-07
这里的结果(来自我的虚构数据)表明,B1和A之间存在显着的关系(“值”系数的测试,因为B1是“ var”系数的参考组),但是两者之间的差异与A的B1关系与与A的B2关系之间的关系不显着(“ value:varB2”系数的测试)。
如果您想根据相关性而不是回归系数来思考,只需在运行模型之前对所有变量(A,B1和B2)进行标准化,您将获得的回归系数将被标准化(与零阶相关,但在解释上更接近)。
另外请注意,这会限制你的分析,只是有案件都 B1和B2(列表删除)的情况。只要能为您提供足够的数据而不会受到不足的影响,并且只要丢失的数据是随机丢失的(或总数据的很小比例,即使它们是非随机丢失的,也无关紧要),那么就可以了。
您将分析限制在同一数据集中以估计B1和B2的效果(而不是根据缺失的不同模式使用稍微不同的数据集)具有以下优点:可以稍微解释相关性之间的差异更直接。如果分别计算每个的相关性,然后测试它们之间的差异,则会遇到以下问题:每种情况下的基础数据都略有不同---您看到的任何差异可能是由于样本中的差异和差异所致在变量之间的实际关系。
lm(A~B1*B2)
会测试B1
和之间的相关性A
是否取决于一个人的B2
分数?该交互作用项不是在测试相关性是否不同。它正在测试两个预测变量是否相互影响。您可以创建一个虚拟代码,C
该代码用于编码B
is B1
或的小数位数B2
。然后,这将告诉您B
和之间的相关性A
取决于它是B1
还是B2
,即相关性是否不同。