Ich arbeite mit Multilevel-Modellen, um verschiedene Muster in der longitudinalen Änderung zu beschreiben. Dingemanse et al (2010) beschreiben ein "Fannout" -Muster, wenn die zufälligen Effekte perfekt korreliert sind. Ich fand jedoch, dass ein ähnliches Muster auftritt, wenn die Beziehung zwischen zufälligen Effekten nicht linear, sondern monoton über das beobachtete Intervall zunimmt. In diesem Fall sind zufällige Effekte nicht perfekt korreliert, sondern durch eine Funktion beschrieben. Siehe Beispiel unten für eine Illustration von diesem. Das Beispiel hat immer noch eine hohe Schnittpunkt-Steigung-Korrelation (> .9), aber es ist möglich, Korrelationen kleiner als .7 zu erhalten, während immer noch eine perfekte Schnittpunkt-Steigung-Beziehung aufrecht erhalten wird.Angeben einer nichtlinearen Beziehung zwischen zufälligen Effekten in R
Meine Frage: Gibt es eine Möglichkeit, eine perfekte (nichtlineare) Beziehung zwischen zufälligen Effekten in einem Multilevel-Modell mit nlme
oder einem anderen R-Paket aufzunehmen? MLwiN hat eine Möglichkeit, die Kovarianz der Steigung abzufangen, was ein Anfang wäre, aber nicht ausreicht, um nichtlineare Beziehungen einzubeziehen. Ich konnte bisher keine Lösungen für nlme
finden, aber vielleicht kennen Sie ein anderes Paket, das dieses Modell enthalten kann.
Entschuldigung für die schlampige Codierung. Ich hoffe, dass meine Frage hinreichend klar ist, aber lassen Sie mich wissen, wenn etwas geklärt werden muss. Jede Hilfe oder alternative Lösung wird sehr geschätzt.
set.seed(123456)
# Change function, quadratic
# Yit = B0ij + B1ij*time + B2ij*time^2
chn <- function(int, slp, slp2, time){
score<-int + slp * time+ slp2 * time^2
return(score)
}
# Set N, random intercept, time and ID
N<-100
start<-rnorm(N,100,15) # Random intercept
time<- matrix(1:15,ncol = 15, nrow = 100,byrow = T) # Time, balanced panel data
ID<-1:N # ID variable
# Random intercept, linear slope: exp(intercept/25)/75, quadratic slope: exp(intercept/25)/250
score3<-matrix(NA,ncol = ncol(time), nrow = N)
for(x in ID){
score3[x,]<-chn(start[x],exp(start[x]/25)/75,exp(start[x]/25)/250,time[x,])
}
#Create dataframe
df<- data.frame(ID,score3)
df2<- melt(df,id = 'ID')
df2$variable<-as.vector(time)
# plot
ggplot(df2, aes(x= variable, y= value)) + geom_line(aes(group = ID)) +
geom_smooth(method = "lm", formula = y ~ x + I(x^2), se =F, size = 2, col ="red")
# Add noise and estimate model
df2$value2<-df2$value + rnorm(N*ncol(time),0,2)
# Random intercept
mod1<-lme(value2 ~ variable + I(variable^2),
random= list(ID = ~1),
data=df2,method="ML",na.action=na.exclude)
summary(mod1)
# Random slopes
mod2<-update(mod1,.~.,random= list(ID = ~variable + I(variable^2)))
summary(mod2)
pairs(ranef(mod2))
konnte immer Bayesian gehen. .. –
Ich habe darüber nachgedacht, Bayesian zu gehen, aber habe nur begrenzte Erfahrung mit R2WinBUGS und R2jags. Wenn Sie mir ein Beispiel zeigen könnten, wäre es sehr zu schätzen. – Niek
@MattTyers Es hat etwas gedauert, aber ich habe einen Versuch mit dem rjags Paket gemacht. Jede Rückmeldung ist jedoch willkommen – Niek