2016-07-10 17 views
1

Ich versuche, eine Interaktion zwischen zwei kontinuierlichen Variablen in R zu plotten. Allerdings sind meine Daten mehrstufig (Menschen innerhalb von Tagen geschachtelt), so dass ich die verschachtelte Struktur meiner Daten berücksichtigen muss wenn ich es grafisch darstelle. Ich analysiere meine Daten mithilfe der lme4-Bibliothek, um die verschachtelte Struktur zu berücksichtigen, aber es fällt mir schwer, herauszufinden, wie man sie grafisch darstellt.Plotten Interaktion von zwei kontinuierlichen Variablen mit lme4 Daten

## example data 
spin = runif(600, 1, 24) 
reg = runif(600, 1, 15) 
ID = rep(c("1","2","3","4","5", "6", "7", "8", "9", "10")) 
day = rep(1:30, each = 10) 
testdata <- data.frame(
    spin, reg, ID, day) 
testdata$fatigue <- testdata$spin*testdata$reg/10*rnorm(30, mean=3, sd=2) 

Hier habe ich meine unabhängige Variablen von Spin und reg, abhängige Variable von Müdigkeit und Menschen (ID) innerhalb weniger Tage verschachtelt. Ich betreibe mein Modell unten.

## running my multilevel model with lme4 
library(lme4) 
m1 <- lmer(fatigue ~ spin * reg + (1 | ID), data = testdata, REML = T) 
(m1) 
confint(m1, test = "Chisq") 

Nehmen wir an, ich habe eine Interaktion zwischen Spin und reg. Ich muss meine kontinuierliche Variable in eine kategoriale Variable setzen, um sie zu zeichnen.

Also erstelle ich kategoriale Variable basierend auf einer meiner kontinuierlichen Variablen. Hier wähle ich Spin. Hinweis: Ich bin mir nicht sicher, ob dieser Code für das, was ich möchte, richtig ist. Müsste Standardfehler machen? Auch berücksichtigt meine verschachtelte Datenstruktur nicht, aber nicht sicher was sonst zu tun ist.

Basierend auf was ich online gefunden habe, kann ich eine grundlegende Handlung erstellen, um Effekte zu zeigen. ABER berücksichtigt keine geschachtelte Struktur (Personen - die Variablen-IDs sind innerhalb von Tagen verschachtelt).

library(ggplot2) 
ggplot(testdata,aes(reg,fatigue,linetype=SpinLevel))+ 
    geom_smooth(method="lm",se=FALSE) 

Diese ggplot ist gut für die grundlegende Wirkung zu interpretieren, aber die Linien sind wahrscheinlich verzerrt, weil sie (die Menschen innerhalb weniger Tage) nicht die verschachtelte Struktur meiner Daten berücksichtigen.

Ich kann mein Modell auch mit der Effektbibliothek grafisch darstellen. Dies berücksichtigt die geschachtelte Struktur. Außer der Graph ist nicht hübsch und ist in Quartilen, und ist sehr schwierig zu interpretieren. Ich möchte, dass es hoch, mittel und niedrig ist und alle auf demselben Diagramm stehen. Aber ich bin mir nicht sicher, wie ich das machen soll.

library(effects) 
plot(effect("spin*reg", m1), grid=TRUE, labels = T, 
    xlevels=list(spin=quantile(testdata$spin, seq(0, 1, 0.25)))) 

Irgendwelche Ideen? Würde sehr geschätzt werden.

+0

Ich sehe nichts in der Modellspezifikation, um Verschachtelung innerhalb 'Tages' anzuzeigen. –

+0

http://stackoverflow.com/questions/9447329/how-to-plot-the-results-of-a-mixed-model –

+0

Ich würde das 'Besen'-Paket als Ersatz für' coefplot2' empfehlen ... aber Ich denke, das OP will ein Effektdiagramm, kein Koeffizientenplot ... –

Antwort

1

Ich ändere das Modell leicht, damit es sowohl ID als auch day widerspiegelt.

Wie wäre es damit:

## example data 
spin = runif(600, 1, 24) 
reg = runif(600, 1, 15) 
ID = rep(c("1","2","3","4","5", "6", "7", "8", "9", "10")) 
day = rep(1:30, each = 10) 
testdata <- data.frame(
spin, reg, ID, day) 
testdata$fatigue <- testdata$spin*testdata$reg/10*rnorm(30, mean=3, sd=2) 

## running my multilevel model with lme4 
library(lme4) 
m1 <- lmer(fatigue ~ spin * reg + (1 | ID/day), data = testdata, REML = T) 
(m1) 
confint(m1, test = "Chisq") 

x <- mean(testdata$spin, na.rm = T) 
print(x) 
y <- sd(testdata$spin, na.rm = T) 
print(y) 

testdata$SpinLevel[testdata$spin > x+y] <- "High" 
testdata$SpinLevel[testdata$spin > x-y & testdata$spin <= x+y] <- "Mean" 
testdata$SpinLevel[testdata$spin <= x-y] <- "Low" 

rm(x,y) 

require(multicomp) 
mp <- as.data.frame(confint(glht(m1))$confint) 
tmp$Comparison <- rownames(tmp) 
ggplot(tmp, aes(x = Comparison, y = Estimate, ymin = lwr, ymax = upr)) + geom_errorbar() + geom_point() 

enter image description here

# or 
library(multcomp) 
tmp <- as.data.frame(confint(glht(m1))$confint) 
tmp$Comparison <- rownames(tmp) 
ggplot(tmp, aes(x = Comparison, y = Estimate, ymin = lwr, ymax = upr)) + geom_errorbar() + geom_point() 

enter image description here

auch:

install.packages("coefplot2", # from this crackpot R coder named Bolker 
       repos="http://www.math.mcmaster.ca/bolker/R", 
       type="source") # I think he died a few years back 
           # jk Ben 
library(coefplot2) 
coefplot2(m1) 
ggplot(tmp, aes(x = Comparison, y = Estimate, ymin = lwr, ymax = upr)) + geom_errorbar() + geom_point() 

Es gibt auch einige sehr inter Farbplots in der Antwort von einer Person namens Wes here.

1

Datenaufbau:

set.seed(101) 
spin = runif(600, 1, 24) 
reg = runif(600, 1, 15) 
ID = rep(c("1","2","3","4","5", "6", "7", "8", "9", "10")) 
day = rep(1:30, each = 10) 
testdata <- data.frame(spin, reg, ID, day) 
testdata$fatigue <- testdata$spin*testdata$reg/10*rnorm(30, mean=3, sd=2) 

Ist ID wirklich verschachtelte innerhalb day?Technisch würde dies vorschlagen, dass Individuum 1 (ID=1) gemessen am Tag 1 eine andere Person darstellt, die ID=1 gemessen am Tag 2 ...?

library(lme4) 
m1 <- lmer(fatigue ~ spin * reg + (1 | ID), 
      data = testdata, REML = TRUE) 
confint(m1, method = "Wald", parm="beta_") 
## instead of test="Chisq", which doesn't work 
##     2.5 % 97.5 % 
## (Intercept) -13.44726318 7.4959080 
## spin   -0.04751327 1.2328254 
## reg   -0.86763792 1.1550787 
## spin:reg  0.11263238 0.2541709 

Warum ist day nicht im Modell ...?

Vorhersagedaten ein:

## midpoints of bin 
spinvals <- quantile(testdata$spin,seq(0,1,length=5))[2:4] 
pframe <- with(testdata, 
      expand.grid(ID=unique(ID), 
         reg=seq(min(reg),max(reg),length.out=51), 
         spin=spinvals)) 
pframe$fatigue <- predict(m1,newdata=pframe) 
pframe$spinFac <- factor(pframe$spin,levels=spinvals) 
## explicit factor() to prevent alphabetization of levels 

library(ggplot2); theme_set(theme_bw()) 
g0 <- ggplot(pframe,aes(reg,fatigue,colour=spinFac))+ 
    geom_line(aes(group=interaction(spinFac,ID))) 

## bins for cutting testdata into 3 levels (min, 0.33,0.66, max) 
## label bins by midpoints 
spincuts <- quantile(testdata$spin,seq(0,1,length=4)) 
testdata$spinFac <- cut(testdata$spin, 
      spincuts,labels=spinvals) 

Ich bin nicht ganz sicher, warum dies der Faktor Ebenen spiegeln ...

g0 + geom_point(data=testdata) 

Hier ist ein erster Versuch, die erforderlichen Daten aus zu ziehen das effects Objekt:

library(effects) 
ee <- effect("spin*reg", m1, 
    xlevels=list(spin=spinvals)) 
eedat <- with(ee,data.frame(x,fatigue=fit,lwr=lower,upr=upper)) 
ggplot(eedat,aes(x=reg,y=fatigue,colour=factor(spin)))+ 
    geom_line()+ 
    geom_ribbon(aes(group=spin,ymin=lwr,ymax=upr),colour=NA, 
          alpha=0.4)