Skip to content

time delayed response as a covariate in lme4

3 messages · marKo, Ben Bolker

#
I have a dataset which have a continuous outcome variable and a time 
(chron) covariate for 99 subjects (id). To get an idea:

 > str(dataframe)
'data.frame':   36352 obs. of  9 variables:
   $ response  : int  100 79 63 50 71 73 62 72 76 77 ...
  $ id   : Factor w/ 99 levels "g1_1","g1_12",..: 2 2 2 2 2 2 2 2 2 2 ...
  $ time   :Classes 'chron', 'dates', 'times'  atomic [1:36352] 15875 
15875 15875 15875 15875 ...
   .. ..- attr(*, "format")= Named chr [1:2] "m/d/y" "h:m:s"
   .. .. ..- attr(*, "names")= chr [1:2] "dates" "times"
   .. ..- attr(*, "origin")= Named num [1:3] 1 1 1970
   .. .. ..- attr(*, "names")= chr [1:3] "month" "day" "year"

I would like to use the time delayed response as a predictor/covariate. 
Lets say a would like to use response at time-1 as a covariate. How can 
this be done?

Something like (conceptually):

model<-lmer(response~poly(time, n) + response(time -1) + (poly(time, 
n)|id, data=dataframe)

I suppose that I could use some correlation structure for this (in nlme, 
because I think that lme4 do not support this a this stage), although 
I'd rather do this in lme4.

Any ideas?

Cheers (and thanks),

Marko
#
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 15-01-20 08:24 AM, marKo wrote:
The standard way to do this in R is to shift the variable by
creating a shifted response variable that is NA in the first row
(because we don't know the response before the observations started)
and runs from 1 to (nobs-1), e.g.

  dataframe <- transform(dataframe,
    shiftresp=c(NA,response[1:(nrow(dataframe)-1)])

You can also use c(NA,head(response,-1)) for this although it may be
less transparent.

  I might suggest transforming your chron response to an explicit
numeric variable -- it might be more transparent (e.g. do you want
your covariate scale to be in response per second?)


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQEcBAEBAgAGBQJUvmEFAAoJEOCV5YRblxUH3BsIAM2S1IFo7hraXTP+gHk1vAG6
vla9p8pjYCYaBlnVVc3zdLXJZP1+BhlXh6A/LTuU1rnc0e4O9yQwW5JM+SqVdDua
Ur3XhMnR+n/PUvJyaoSQ92fFv9rpgP/JtDf36Om2VLodLNVBnWxUrSnnTnd/QeE4
hUv79mGE/RqbueP0H8YwcNAmNmZR/iMd+uC2nYli9Viv42Fk6lE/oNs13wW5AiOT
BytB45z0rX5qesjam+HY9UX+0dejSV5ldRN8fQ9SJPSMddDZzny5KIbmdgho6lxc
0N4suZXIfztU56IbAYJDDwCZmE7Vuv3rkMSci1jY6UbaYCihW86V9BYzK3QTZ+I=
=h/4l
-----END PGP SIGNATURE-----
#
On 01/20/2015 03:07 PM, Ben Bolker wrote:
Thanks for your reply Ben.

I thought that it might be something like that. I have another problem 
in that area, because I actually have two response variable (something 
like y and z coordinates) and, since they are on the same scale, I am 
trying to fit a models to the outcome conditional to the response 
coordinates.
To make it mode clear:

response    response_id    time    id
r1x    x    t1    1
r1z    z    t1    1
r2x    x    t2    1
r2z    z    t2    1
?.

so the model actually looks something like that:

model<-lmer(response~response_id*poly(time, n)+(response_id*poly(time, 
n)|id), data=dataset).

My hope was that it can be done in some other way just to avoid 
potential errors that might occur when fiddling with transpositions like 
the one suggested (different number of observations per id and 
potentially missing x or y coordinate).
As for the chron object, since I'm trying to fit a polynomial, I have 
rescaled the time in a numeric form from 0 to 1 (the time is actually od 
the form YYYY/MM/DD HH:MM:SS an the span is of 3 weeks, but I am only 
interested in daily variation. So the beginning of the day is 0 and the 
end 1). The polynomial have a much more simple behavior in that range.