Ich versuche, mehrere Interaktionstests zwischen beiden lm
und lmer
wiederholten Messungen (2x2x2) zu reproduzieren. Der Grund, warum ich beide Methoden vergleichen möchte, ist, dass das GLM von SPSS für wiederholte Messungen genau die gleichen Ergebnisse liefert wie der lm
hier vorgestellte Ansatz. Am Ende möchte ich SPSS mit R-lmer vergleichen. Bisher habe ich nur einige dieser Interaktionen (genau) reproduziert.
Unten finden Sie ein Skript, um meinen Standpunkt besser zu veranschaulichen:
library(data.table)
library(tidyr)
library(lmerTest)
library(MASS)
set.seed(1)
N <- 100 # number of subjects
sigma <- 1 # popuplation sd
rho <- .6 # correlation between variables
# X1: a a a a b b b b
# X2: a a b b a a b b
# X3: a b a b a b a b
mu <- c(5, 3, 3, 5, 3, 5, 5, 3) # means
# Simulate the data
sigma.mat <- rep(sigma, length(mu))
S <- matrix(sigma.mat, ncol = length(sigma.mat), nrow = length(sigma.mat))
Sigma <- t(S) * S * rho
diag(Sigma) <- sigma**2
X <- data.table( mvrnorm(N, mu, Sigma) )
setnames(X, names(X), c("aaa", "aab", "aba", "abb", "baa", "bab", "bba", "bbb"))
X[, id := 1:.N]
# Long format
XL <- data.table( gather(X, key, Y, aaa:bbb) )
XL[, X1 := substr(key, 1, 1)]
XL[, X2 := substr(key, 2, 2)]
XL[, X3 := substr(key, 3, 3)]
# Recode long format (a = +1; b = -1)
XL[, X1c := ifelse(X1 == "a", +1, -1)]
XL[, X2c := ifelse(X2 == "a", +1, -1)]
XL[, X3c := ifelse(X3 == "a", +1, -1)]
### Composite scores to be used with lm
# X2:X3 2-way interaction (for half the data; i.e. when X1 == "a")
X[, X1a_X2.X3 := (aaa - aab) - (aba - abb)]
# X2:X3 2-way interaction (for all the data)
X[, aa := (aaa + baa) / 2]
X[, ab := (aab + bab) / 2]
X[, ba := (aba + bba) / 2]
X[, bb := (abb + bbb) / 2]
X[, X2.X3 := (aa - ab) - (ba - bb)]
# X1:X2:X3 3-way interaction (for all the data)
X[, X1.X2.X3 := ( (aaa - aab) - (aba - abb) ) - ( (baa - bab) - (bba - bbb) )]
### Fit models
# X2:X3 2-way interaction (for half the data; i.e. when X1 == "a")
summary( lm(X1a_X2.X3 ~ 1, X) ) # t = 34.13303
summary( lmer(Y ~ X2c*X3c + (X2c+X3c|id), XL[X1 == "a"]) ) # t = 34.132846 close match
summary( lmer(Y ~ X2c*X3c + (X2c+X3c||id), XL[X1 == "a"]) ) # t = 34.134624 close match
# X2:X3 2-way interaction (for all the data)
summary( lm(X2.X3 ~ 1, X) ) # t = 0.3075025
summary( lmer(Y ~ X2c*X3c + (X2c+X3c|id), XL) ) # t = 0.1641932
summary( lmer(Y ~ X2c*X3c + (X2c+X3c||id), XL) ) # t = 0.1640710
summary( lmer(Y ~ X2c*X3c + (X2c*X3c|id), XL) ) # t = 0.1641765
anova( lmer(Y ~ X2c*X3c + (X2c*X3c|id), XL), ddf = "Kenward-Roger" ) # t = 0.1643168
summary( lmer(Y ~ X2c*X3c + (X2c*X3c|id), XL, REML = FALSE) ) # t = 0.1645303
summary( lmer(Y ~ X2c*X3c + (X2c*X3c||id), XL) ) # t = 0.1640704
# X1:X2:X3 3-way interaction (for all the data)
summary( lm(X1.X2.X3 ~ 1, X) ) # t = 46.50177
summary( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c - X1c:X2c:X3c|id), XL) ) # t = 49.0317599
anova( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c - X1c:X2c:X3c|id), XL), ddf = "Kenward-Roger" ) # t = 49.03176
summary( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c - X1c:X2c:X3c|id), XL, REML = FALSE) ) # t = 49.2677606
summary( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c - X1c:X2c:X3c||id), XL) ) # t = 46.5193774 close match
summary( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c|id), XL) ) # unidentifiable
summary( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c|id), XL,
control = lmerControl(check.nobs.vs.nRE="ignore")) ) # t = 46.5148684 close match
Wie Sie von oben sehen können, lm
stimmt keine der Schätzungen genau mit denen überein lmer
. Obwohl einige der Ergebnisse sehr ähnlich sind und sich nur aus numerischen / rechnerischen Gründen unterscheiden können. Die Lücke zwischen beiden Schätzmethoden ist besonders groß für die X2:X3 2-way interaction (for all the data)
.
Meine Frage ist, ob es eine Möglichkeit gibt, mit beiden Methoden genau die gleichen Ergebnisse zu erzielen, und ob es eine korrekte Methode gibt, mit der die Analysen durchgeführt werden können lmer
(obwohl sie möglicherweise nicht mit den lm
Ergebnissen übereinstimmen ).
Bonus:
Ich habe festgestellt, dass die t value
mit der 3-Wege-Interaktion verbundene Funktion von der Art und Weise beeinflusst wird, wie Faktoren codiert werden, was mir sehr seltsam erscheint:
summary( lmer(Y ~ X1*X2*X3 + (X1*X2*X3 - X1:X2:X3||id), XL) ) # t = 48.36
summary( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c - X1c:X2c:X3c||id), XL) ) # t = 56.52
lm
Modell übersetzt werden können ) mit reproduzierenlmer
und auch wissen, was die richtigenlmer
Analysen für diese Art von Daten sind.lm
; Ich vermute, deshalb ist die T-Statistik in ungefähr zweimal kleinerlmer
. Sie könnten wahrscheinlich dasselbe Phänomen mit einem einfacheren 2x2-Design beobachten und die Haupteffekte betrachten, ohne sich um 2x2x2 und komplizierte Interaktionen zu kümmern.Antworten:
Seltsam, wenn ich Ihr letztes Modell verwende, finde ich eine perfekte Übereinstimmung, keine enge Übereinstimmung:
quelle
summary( lmer(Y ~ X1c*X2c*X3c + (X1c*X2c*X3c|id), XL, control=lmerControl(check.nobs.vs.nRE="ignore")) )$coefficients
kehrtt = 46.5148684
für mich zurück. Könnte ein Versionsproblem sein? Ich benutzeR version 3.5.3 (2019-03-11)
undlmerTest 3.1-0
.