[R] gam(mgcv) predicting across random effect and understanding narrow CI

Anna Hargreaves anna.hargreaves at queensu.ca
Sat Jan 25 16:29:54 CET 2014

Hi everyone,

I am new to additive modelling and am surprised by the results of a model
I'm working on.  I wanted to check with more experienced users to make sure
I'm not misunderstanding something basic.

*Data:* I have 10 replicated runs from an evolutionary simulation model,
measuring the evolved change in dispersal after an event (climate change)
across a spatial environmental gradient.  I want to find a fitted line
showing mean change in dispersal across the gradient/model landscape with
95% confidence intervals, as a way of assessing in which parts of the
gradient dispersal changed significantly (ie if 95% CI don't overlap 0).  My
data is:

response = change in dispersal ('Ddif')
predictor = position along spatial gradient 401 columns long ('col')
random effect = replicate ('rep')
The data are here: https://www.dropbox.com/sh/3xfjusgkit9bvt2/Ts2KjMOa7Y
(There are NAs at the first and last columns of each run as simulation
organisms died out at the extremes of the environmental gradient)

*Question 1:* Because adding the random effect is drastically reducing my
perceived sample size (from ~4000 data points to only 10 independent model
runs), I expected a large increase in the width of the CI.  However, there
is almost no difference in the line or CI produced by the models:

gam.nore <- gam(Ddif ~ s(col), data=trapzdc0, method="REML")
gam.re    <- gam(Ddif ~ s(col) + s(rep, bs="re"), data=trapzdc0,

There is also very little change in the R^2 and no change in n=3590 reported
in the summary.  I tried with gamm as well but still no noticeable change (I
know that in this case I'm adding a random intercept instead of a random
smoother but figured I'd try everything):

gamm.re <- gamm(Ddif ~ s(col), random = list(rep =~ 1), data = trapzdc0)

Why do the CI change so little?
Is a random effect not the right way to account for non-independence of data
in GAMs?
Have I coded something incorrectly?

*Question 2:* When I ask for a predicted line across replicates (ie
summarizing the general patterns of the model), I get predicted lines that
are 3590 long (ie across all data points), rather than 401 (the length of
the predictor variable).  This also makes me think I somehow haven't
communicated the random effect properly to R.

pgam.re <- as.data.frame(predict(gam.re, type='link', level=0, se.fit =
#[1] 3590    2

I tried adding 'level=0', which asks for a global prediction across random
effects in lmer, but no change.
pgam.re <- as.data.frame(predict(gam.re, type='link', level=0, se.fit =

Even if I make a new data frame of the right length (401) across which the
model should predict and a dummy 'rep' variable I get a predictor 3590 long:
col <- c(seq(1,401,1))
rep <- c(rep(0,401))   
newdat <- as.data.frame(cbind(col,rep)); dim(newdat)

pgam.re2 <- as.data.frame(predict(gam.re, type='link', level=0, se.fit =
TRUE, data=newdat))
[1] 3590    2

How can I get a prediction (for use in plotting, eg ggplot) across

I've spent days trolling for answers in help sites to no avail - any insight
would be greatly appreciated!

View this message in context: http://r.789695.n4.nabble.com/gam-mgcv-predicting-across-random-effect-and-understanding-narrow-CI-tp4684135.html
Sent from the R help mailing list archive at Nabble.com.

More information about the R-help mailing list