我有以下设置来分析: 我们有大约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...)
任何想法都会受到欢迎。
最佳, 塔尔
答案 0 :(得分:4)
我同意特里斯坦 - 你正在寻找ICC。与标准实现的唯一区别在于两个评估者(测试)反复评估每个主题。可能有一个实现允许这样做。同时,这是获得相关性的另一种方法。
您可以使用“一般线性模型”,它是明确允许残差之间相关性的线性模型的推广。下面的代码使用gls
包的nlme
函数实现此功能。我相信还有其他方法。要使用此功能,我们必须首先将数据重塑为“长”格式。为简单起见,我还将变量名称更改为x
和y
。我在您的代码中也使用了+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 correlation。 psy包中有一个实现,虽然我还没有使用它。
如果要对相关估计值进行推断,可以引导主题。只需确保每个样品都保持一致。
答案 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