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
time delayed response as a covariate in lme4
3 messages · marKo, Ben Bolker
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On 15-01-20 08:24 AM, marKo wrote:
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.
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:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 15-01-20 08:24 AM, marKo wrote:
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.
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-----
_______________________________________________ R-sig-mixed-models at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-mixed-models
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.