怎么做:与“块”相关(或 - “重复措施”?!)?

时间:2010-02-25 17:19:53

标签: r statistics correlation

我有以下设置来分析: 我们有大约150个科目,并且对于每个科目,我们进行了18次测试(在不同条件下)。 测试的18种不同条件是互补的,这样如果我们在测试中平均(对于每个受试者),我们将在测试之间(受试者之间)没有相关性。 我们希望知道的是测试之间的相关性(和P值),在受试者内部,但在所有受试者之间。

我现在这样做的方法是为每个主题执行相关,然后查看收到的相关性的分布,以查看它的平均值是否不同于0。 但我怀疑可能有更好的方式来回答同一个问题(有人对我说了一些关于“地理相关性”的内容,但是一个浅薄的搜索并没有帮助。)

ps:我知道这里可能有一个地方可以做某种混合模型,但我更愿意提出“相关性”,并且不确定如何从混合模型中提取这样的输出。

此外,这是一个简短的虚拟代码,用于了解我在说什么:

attach(longley)
N <- length(Unemployed)
block <- c(
        rep( "a", N),
        rep( "b", N),
        rep( "c", N)
        )

Unemployed.3 <- c(Unemployed + rnorm(1),
                    Unemployed + rnorm(1),
                    Unemployed + rnorm(1))

GNP.deflator.3 <- c(GNP.deflator + rnorm(1),
                    GNP.deflator + rnorm(1),
                    GNP.deflator + rnorm(1))

cor(Unemployed, GNP.deflator)
cor(Unemployed.3, GNP.deflator.3)
cor(Unemployed.3[block == "a"], GNP.deflator.3[block == "a"])
cor(Unemployed.3[block == "b"], GNP.deflator.3[block == "b"])
cor(Unemployed.3[block == "c"], GNP.deflator.3[block == "c"])
(I would like to somehow combine the last three correlations...)

任何想法都会受到欢迎。

最佳, 塔尔

3 个答案:

答案 0 :(得分:4)

我同意特里斯坦 - 你正在寻找ICC。与标准实现的唯一区别在于两个评估者(测试)反复评估每个主题。可能有一个实现允许这样做。同时,这是获得相关性的另一种方法。

您可以使用“一般线性模型”,它是明确允许残差之间相关性的线性模型的推广。下面的代码使用gls包的nlme函数实现此功能。我相信还有其他方法。要使用此功能,我们必须首先将数据重塑为“长”格式。为简单起见,我还将变量名称更改为xy。我在您的代码中也使用了+rnorm(N)而不是+rnorm(1),因为这就是我认为您的意思。

library(reshape)
library(nlme)
dd <- data.frame(x=Unemployed.3, y=GNP.deflator.3, block=factor(block))
dd$occasion <- factor(rep(1:N, 3))  # variable denoting measurement occasions
dd2 <- melt(dd, id=c("block","occasion"))  # reshape

# fit model with the values within a measurement occasion correlated
#   and different variances allowed for the two variables
mod <- gls(value ~ variable + block, data=dd2, 
           cor=corSymm(form=~1|block/occasion), 
           weights=varIdent(form=~1|variable))  
# extract correlation
mod$modelStruct$corStruct

在建模框架中,您可以使用似然比检验来获得p值。 nlme还可以为您提供置信区间:

mod2 <- gls(value ~ variable + block, data=dd2, 
           weights=varIdent(form=~1|variable))  
anova(mod, mod2)   # likelihood-ratio test for corr=0

intervals(mod)$corStruct  # confidence interval for the correlation

答案 1 :(得分:1)

如果我正确理解您的问题,您有兴趣在多个测试之间计算intraclass correlationpsy包中有一个实现,虽然我还没有使用它。

如果要对相关估计值进行推断,可以引导主题。只需确保每个样品都保持一致。

答案 2 :(得分:0)

我不是专家,但这就像我想要的那样。它是自动化的,代码短,提供与上述示例相同的相关性,并产生p值。

> df = data.frame(block=block, Unemployed=Unemployed.3,
+ GNP.deflator=GNP.deflator.3)
> require(plyr)
Loading required package: plyr
> ddply(df, "block", function(x){
+   as.data.frame(
+     with(x,cor.test(Unemployed, GNP.deflator))[c("p.value","estimate")]
+ )})
  block    p.value  estimate
1     a 0.01030636 0.6206334
2     b 0.01030636 0.6206334
3     c 0.01030636 0.6206334

要查看所有详细信息,请执行以下操作:

> dlply(df, "block", function(x){with(x,cor.test(Unemployed, GNP.deflator))})
$a

    Pearson's product-moment correlation

data:  Unemployed and GNP.deflator 
t = 2.9616, df = 14, p-value = 0.01031
alternative hypothesis: true correlation is not equal to 0 
95 percent confidence interval:
 0.1804410 0.8536976 
sample estimates:
      cor 
0.6206334 


$b

    Pearson's product-moment correlation

data:  Unemployed and GNP.deflator 
t = 2.9616, df = 14, p-value = 0.01031
alternative hypothesis: true correlation is not equal to 0 
95 percent confidence interval:
 0.1804410 0.8536976 
sample estimates:
      cor 
0.6206334 


$c

    Pearson's product-moment correlation

data:  Unemployed and GNP.deflator 
t = 2.9616, df = 14, p-value = 0.01031
alternative hypothesis: true correlation is not equal to 0 
95 percent confidence interval:
 0.1804410 0.8536976 
sample estimates:
      cor 
0.6206334 


attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
  block
1     a
2     b
3     c