[R-sig-eco] Periodic regression

Dixon, Philip M [STAT] pdixon at iastate.edu
Tue Nov 22 17:54:21 CET 2016


Thiago,

I would not try to interpret each periodic component separately.  That linear regression model is just a convenient way to fit a model with a phase-shifted cosine curve:

log (mean index) = b0 + A*cos(c*time - theta)

The amplitude of the oscillation is A; the phase shift is theta.  Those can be estimated from the regression coefficients in the linear model:
log (mean index) = b0 + b1 cos(c*t) + b2 sin(c*t)

as:
A = sqrt(b1^2 + b2^2)
theta = atan(b2/b1)

Here's R code to implement these calculations:
tad.lm<-glm(index~(cos(2*pi*(hora/24)))+(sin(2*pi*(hora/24))), 
  family=quasipoisson)
tad.coef <- coef(tad.lm)[2:3]

A <- sqrt(sum(tad.coef^2))   # where tad.coef is only periodic components
phase <- atan2(tad.coef[2],tad.coef[1])
#  in radians, in the appropriate quadrant

maxhora <- phase*24/(2*pi)
maxhora <- ifelse(maxhora < 0, 24+maxhora, maxhora)
#  and in hours, shifting by 24 hr if negative

Standard errors are obtained by the delta method.
Confidence intervals are best obtained by bootstrapping.  You should think hard about what sort of bootstrap to use (observations, standardized residuals, parametric on the estimates, parametric on the observations).

Chester Bliss's pamphlet on Periodic regression in Biology and ?? is a good introduction, but remember that his computing resources is 60 years old.

The test of "no aggregation" that I suggested (one of many possibilities) = test of "no periodic components".  That is the test that both b1 = 0 and b2 = 0 in the linear model above.  Can use either a drop in quasi-deviance or a C Beta test on the estimates.  Asymptotically equivalent; usually similar but rarely identical in practical samples.  

R code is:

tad.lm<-glm(index~(cos(2*pi*(hora/24)))+(sin(2*pi*(hora/24))), 
  family=quasipoisson)
tad.lm0 <- glm(index~1, family=quasipoisson)

# F (drop in quasi deviance) test for both periodic coefficients = 0
anova(tad.lm0, tad.lm, test='F')

# C Beta test for both periodic coefficients = 0

tad.coef <- coef(tad.lm)[2:3]
tad.vc <- vcov(tad.lm)[2:3,2:3]
# extract coefficients and variance-covariance matrix for periodic terms
#  i.e. dropping the estimated intercept

npar <- length(tad.coef)
nobs <- length(hora)
# extract # parameters in test and # observations in data set

tad.f <- (t(tad.coef) %*% solve(tad.vc) %*% tad.coef) / npar
c(F = tad.f, probF=pf(tad.f, npar, nobs-(npar+1), lower=F))
 
Unless there are issues of general interest to the list, I suggest any further discussion be done off-list.

Best wishes,
Philip Dixon



More information about the R-sig-ecology mailing list