Thanks again Gavin, this works. gamm() also models the long term trend with a spline s(Time), which is great. I would still like though, to be able to say whether the factor is trending up or down over time. Would it be fair to query summary(mod$lme)$tTable and to look at the p-value and "Value" corresponding Xs(time)Fx1 value to identify such a trend?
Also, here are a few syntax corrections on the code provided in the last email: 1)visual appoach plot(mod$gam, pages = 1) 2) quantitative approach pred <- predict(mod$gam, newdata = newdat, type = "terms") take <- which(pred[,"s(DoY)"] == max(pred[,"s(DoY)"])) or take <- as.numeric(which.max(pred[,"s(DoY)"])) Cheers, -Jacob On Wed, Mar 26, 2014 at 9:46 AM, Gavin Simpson <ucfa...@gmail.com> wrote: > 1) Visually - unless it actually matters exactly on which day in the > year the peak is observed? If visually is OK, just do `plot(mod, pages > = 1)` to see the fitted splines on a single page. See `?plot.gam` for > more details on the plot method. > > 2) You could generate some new data to predict upon as follows: > > newdat <- data.frame(DoY = seq_len(366), time = mean(foo$time)) > > Then predict for those new data but collect the individual > contributions of the spline terms to the predicted value rather than > just the final prediction > > pred <- predict(mod, newdata = newdat, type = "terms") > > Then find the maximal value of the DoY contribution > > take <- which(pred$DoY == max(pred$DoY)) > newdat[take, , drop = FALSE] > > You could use > > take <- which.max(pred$DoY) > > instead of the `which()` I used, but only if there is a single maximal > value. > > This works because the spline terms in the additive model are just > that; additive. Hence because you haven't let the DoY and time splines > interact (in the simple model I mentioned, it is more complex if you > allow these to interact as you then need to predict DoY for each years > worth of time points), you can separate DoY from the other terms. > > None of the above code has been tested, but was written off top of my > head, but should work or at least get you pretty close to something > that works. > > HTH > > G > > On 26 March 2014 10:02, Jacob Cram <cramj...@gmail.com> wrote: > > Thanks Gavin, > > This seems like a promising approach and a first pass suggests it > works > > with this data. I can't quite figure out how I would go about > interrogating > > the fitted spline to deterine when the peak value happens with respect to > > DoY. Any suggestions? > > -Jacob > > > > > > On Tue, Mar 25, 2014 at 9:06 PM, Gavin Simpson <ucfa...@gmail.com> > wrote: > >> > >> I would probably attack this using a GAM modified to model the > >> residuals as a stochastic time series process. > >> > >> For example > >> > >> require("mgcv") > >> mod <- gamm(y ~ s(DoY, bs = "cc") + s(time), data = foo, > >> correlation = corCAR1(form = ~ time)) > >> > >> where `foo` is your data frame, `DoY` is a variable in the data frame > >> computed as `as.numeric(strftime(RDate, format = "%j"))` and `time` is > >> a variable for the passage of time - you could do `as.numeric(RDate)` > >> but the number of days is probably large as we might encounter more > >> problems fitting the model. Instead you might do `as.numeric(RDate) / > >> 1000` say to produce values on a more manageable scale. The `bs = > >> "cc"` bit specifies a cyclic spline applicable to data measured > >> throughout a year. You may want to fix the start and end knots to be > >> days 1 and days 366 respectively, say via `knots = list(DoY = > >> c(0,366))` as an argument to `gam()` [I think I have this right, > >> specifying the boundary knots, but let me know if you get an error > >> about the number of knots]. The residuals are said to follow a > >> continuois time AR(1), the irregular-spaced counter part to the AR(1), > >> plus random noise. > >> > >> There may be identifiability issues as the `s(time)` and `corCAR1()` > >> compete to explain the fine-scale variation. If you hit such a case, > >> you can make an educated guess as to the wiggliness (degrees of > >> freedom) for the smooth terms based on a plot of the data and fix the > >> splines at those values via argument `k = x` and `fx = TRUE`, where > >> `x` in `k = x` is some integer value. Both these go in as arguments to > >> the `s()` functions. If the trend is not very non-linear you can use a > >> low value 1-3 here for x and for the DoY term say 3-4 might be > >> applicable. > >> > >> There are other ways to approach this problem of identifiability, but > >> that would require more time/space here, which I can go into via a > >> follow-up if needed. > >> > >> You can interrogate the fitted splines to see when the peak value of > >> the `DoY` term is in the year. > >> > >> You can also allow the seasonal signal to vary in time with the trend > >> by allowing the splines to "interact" in a 2d-tensor product spline. > >> Using `te(DoY, time, bs = c("cc","cr"))` instead of the two `s()` > >> terms (or using `ti()` terms for the two "marginal" splines and the > >> 2-d spline). Again you can add in the `k` = c(x,y), fx = TRUE)` to the > >> `te()` term where `x` and `y` are the dfs for each dimension in the > >> `te()` term. It is a bit more complex to do this for `ti()` terms. > >> > >> Part of the reason to prefer a spline for DoY for the seasonal term is > >> that one might not expect the seasonal cycle to be a symmetric cycle > >> as a cos/sin terms would imply. > >> > >> A recent ecological paper describing a similar approach (though using > >> different package in R) is that of Claire Ferguson and colleagues in J > >> Applied Ecology (2008) http://doi.org/10.1111/j.1365-2664.2007.01428.x > >> (freely available). > >> > >> HTH > >> > >> G > >> > >> On 25 March 2014 19:14, Jacob Cram <cramj...@gmail.com> wrote: > >> > Hello all, > >> > I am thinking about applying season::cosinor() analysis to some > >> > irregularely spaced time series data. The data are unevenly spaced, so > >> > usual time series methods, as well as the nscosinor() function are > out. > >> > My > >> > data do however trend over time and I am wondering if I can feed date > as > >> > a > >> > variable into my cosinor analyis. In the example below, then I'd > >> > conclude > >> > then that the abundances are seasonal, with maximal abundance in mid > >> > June > >> > and furthermore, they are generally decreasing over time. > >> > Can I use both time variables together like this? If not, is there > some > >> > better approach I should take? > >> > Thanks in advance, > >> > -Jacob > >> > > >> > For context lAbundance is logg-odds transformed abundance data of a > >> > microbial species in a given location over time. RDate is the date > the > >> > sample was collected in the r date format. > >> > > >> > > >> >> res <- cosinor(lAbundance ~ RDate, date = "RDate", data = lldata) > >> > > >> >>summary(res) > >> > Cosinor test > >> > Number of observations = 62 > >> > Amplitude = 0.58 > >> > Phase: Month = June , day = 14 > >> > Low point: Month = December , day = 14 > >> > Significant seasonality based on adjusted significance level of 0.025 > = > >> > TRUE > >> > > >> >>summary(res$glm) > >> > > >> > > >> > Call: > >> > glm(formula = f, family = family, data = data, offset = offset) > >> > > >> > Deviance Residuals: > >> > Min 1Q Median 3Q Max > >> > -2.3476 -0.6463 0.1519 0.6574 1.9618 > >> > > >> > Coefficients: > >> > Estimate Std. Error t value Pr(>|t|) > >> > (Intercept) 0.0115693 1.8963070 0.006 0.99515 > >> > RDate -0.0003203 0.0001393 -2.299 0.02514 * > >> > cosw -0.5516458 0.1837344 -3.002 0.00395 ** > >> > sinw 0.1762904 0.1700670 1.037 0.30423 > >> > --- > >> > Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > >> > > >> > (Dispersion parameter for gaussian family taken to be 0.9458339) > >> > > >> > Null deviance: 70.759 on 61 degrees of freedom > >> > Residual deviance: 54.858 on 58 degrees of freedom > >> > AIC: 178.36 > >> > > >> > Number of Fisher Scoring iterations: 2 > >> > > >> > > >> > llldata as a csv below > >> > "RDate","lAbundance" > >> > 2003-03-12,-3.3330699059335 > >> > 2003-05-21,-3.04104625745886 > >> > 2003-06-17,-3.04734680029566 > >> > 2003-07-02,-4.18791034708572 > >> > 2003-09-18,-3.04419201802053 > >> > 2003-10-22,-3.13805060873929 > >> > 2004-02-19,-3.80688269144794 > >> > 2004-03-17,-4.50755507726145 > >> > 2004-04-22,-4.38846502542992 > >> > 2004-05-19,-3.06618649442674 > >> > 2004-06-17,-5.20518774876304 > >> > 2004-07-14,-3.75041853151097 > >> > 2004-08-25,-3.67882486716196 > >> > 2004-09-22,-5.22205827512234 > >> > 2004-10-14,-3.99297508670535 > >> > 2004-11-17,-4.68793287601157 > >> > 2004-12-15,-4.31712380781011 > >> > 2005-02-16,-4.30893550479904 > >> > 2005-03-16,-4.05781773988454 > >> > 2005-05-11,-3.94746237402035 > >> > 2005-07-19,-4.91195185391358 > >> > 2005-08-17,-4.93590576323119 > >> > 2005-09-15,-4.85820800095518 > >> > 2005-10-20,-5.22956391101343 > >> > 2005-12-13,-5.12244047315448 > >> > 2006-01-18,-3.04854660925046 > >> > 2006-02-22,-6.77145858348375 > >> > 2006-03-29,-4.33151493849021 > >> > 2006-04-19,-3.36152357710535 > >> > 2006-06-20,-3.09071584142593 > >> > 2006-07-25,-3.31430484483825 > >> > 2006-08-24,-3.09974933041469 > >> > 2006-09-13,-3.33288992218458 > >> > 2007-12-17,-4.19942661980677 > >> > 2008-03-19,-3.86146499633625 > >> > 2008-04-22,-3.36161599919095 > >> > 2008-05-14,-4.30878307213324 > >> > 2008-06-18,-3.74372448768828 > >> > 2008-07-09,-4.65951429661651 > >> > 2008-08-20,-5.35984647704619 > >> > 2008-09-22,-4.78481898261137 > >> > 2008-10-20,-3.58588161980965 > >> > 2008-11-20,-3.10625125552057 > >> > 2009-02-18,-6.90675477864855 > >> > 2009-03-11,-3.43446932013368 > >> > 2009-04-23,-3.82688066341466 > >> > 2009-05-13,-4.44885332005661 > >> > 2009-06-18,-3.97671552612412 > >> > 2009-07-09,-3.40185954003936 > >> > 2009-08-19,-3.44958231694091 > >> > 2009-09-24,-3.86508161094726 > >> > 2010-01-28,-4.95281587967569 > >> > 2010-02-11,-3.78064756876257 > >> > 2010-03-24,-3.5823501176064 > >> > 2010-04-27,-4.33635715879999 > >> > 2010-05-17,-3.90545735473055 > >> > 2010-07-21,-3.3147176517321 > >> > 2010-08-11,-4.53218360860017 > >> > 2010-10-21,-6.90675477864855 > >> > 2010-11-23,-6.90675477864855 > >> > 2010-12-16,-6.75158176094352 > >> > 2011-01-11,-6.90675477864855 > >> > > >> > [[alternative HTML version deleted]] > >> > > >> > _______________________________________________ > >> > R-sig-ecology mailing list > >> > R-sig-ecology@r-project.org > >> > https://stat.ethz.ch/mailman/listinfo/r-sig-ecology > >> > >> > >> > >> -- > >> Gavin Simpson, PhD > > > > > > > > -- > Gavin Simpson, PhD > [[alternative HTML version deleted]] _______________________________________________ R-sig-ecology mailing list R-sig-ecology@r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-ecology