Wie zu tun: Korrelation mit „Blöcken“ (oder - „wiederholte Maßnahmen“?!)?
-
22-09-2019 - |
Frage
Ich habe folgendes Setup zu analysieren: Wir haben über 150 Themen und für jeden Probanden führten wir ein Paar Tests (unter verschiedenen Bedingungen) 18-mal. Die 18 verschiedenen Bedingungen des Tests ergänzen, in eine solche Art und Weise, so dass, wenn wir wo man Durchschnitt der Tests (für jedes Thema), würden wir keine Korrelation zwischen den Tests (zwischen Probanden) erhalten. Was wir wissen wollen, ist die Korrelation (und P-Wert) zwischen den Tests, in innerhalb von Themen, aber über alle Themen.
So wie ich dies jetzt tat, war die Korrelation für jedes Thema durchzuführen, und dann Blick auf der Verteilung des so erhaltenen Korrelationen zu sehen, ob es Mittel anders ist dann 0. Aber ich vermute, es könnte eine bessere Möglichkeit, die gleiche Frage zu beantworten (jemand sagte mir etwas über „geografische Korrelation“, sondern eine flache Suche hat nicht geholfen).
ps:. Ich verstehe, dass es vielleicht ein Ort, hier eine Art Mischmodell zu tun, aber ich würde es vorziehen, eine „Korrelation“ zu präsentieren, und ich bin nicht sicher, wie aus einem gemischten Modell so eine Ausgabe zu extrahieren
Auch hier ist ein kurzer Code dummy eine Vorstellung von dem, was ich rede zu geben:
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...)
wird Irgendwelche Ideen begrüßt werden.
Best, Tal
Lösung
Ich bin mit Tristan - Sie ICC suchen. Der einzige Unterschied zu Standard-Implementierungen ist, daß die zwei Beurteilern (Tests) jedes Thema wiederholt auszuwerten. Es könnte eine Implementierung, die das erlaubt. In der Zwischenzeit hier ist ein weiterer Ansatz, um die Korrelation zu erhalten.
Sie können die „allgemeine lineare Modelle“ verwenden, die Verallgemeinerungen von linearen Modelle sind, die explizit Korrelation ermöglichen, zwischen Residuen. Der folgende Code implementiert diese die gls
Funktion des nlme
Paket. Ich bin sicher, es gibt auch andere Möglichkeiten, wie gut. Um diese Funktion nutzen wir die Daten in eine „long“ -Format zum ersten reshape haben. Ich habe auch die Variablennamen zu x
und y
der Einfachheit halber geändert. Ich auch +rnorm(N)
statt +rnorm(1)
in Ihrem Code verwendet wird, denn das ist, was ich denke, Sie meinen.
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
In dem Modellierungsrahmen können Sie einen Wahrscheinlichkeitsverhältnis-Test verwenden, um einen p-Wert zu erhalten. nlme
können Sie auch ein Konfidenzintervall geben:
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
Andere Tipps
Wenn ich das richtig verstehe Ihre Frage, sind Sie bei der Berechnung der interessiert Intra Korrelation zwischen mehreren Tests. Es ist eine Implementierung in dem psy Paket, obwohl ich nicht verwendet wird.
Wenn Sie auf die Korrelationsschätzung auszuführen Inferenz möchten, können Sie die Themen Bootstrap. So stellen Sie sicher, um die Tests zusammen zu halten für jede Probe.
Ich bin kein Experte, aber das sieht mir wie das, was Sie wollen. Es ist automatisiert, kurz, um Code, über die gleich Korrelationen wie Ihr Beispiel gibt, und erzeugt p-Werte.
> 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
Um alle Details zu sehen, dies zu tun:
> 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