Christoph Scherber
2013-Jul-16 08:52 UTC
[R] MGCV: overlay fitted (marginal) curves over a plot of the original data
Dear R users, I?ve stumbled over a problem that can be easily seen from the R code below: - When I use plot.gam() on a fitted model object, I get a nice and well-looking smooth curve for all terms in the model. - However, when I use predict(model) for a given predictor, with values of all other predictors set to their means, the resulting curve doesn?t fit well at all. Is there a way to "overlay" the curve produced by plot.gam() over a plot of the original data? Here?s some reproducible code with mgcv version 1.7-22 on R3.0.1 (Windows 7): ## library(mgcv) set.seed(2) dat <- gamSim(1,n=400,dist="normal",scale=2) b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat) plot(b,select=1) plot(y~x0,dat) mydata=data.frame(x0=0:1,x1=mean(dat$x1),x2=mean(dat$x2),x3=mean(dat$x3)) lines(0:1,predict(b,mydata,type="response")) ## Best wishes, Christoph -- PD Dr Christoph Scherber Georg-August University Goettingen Department of Crop Science Agroecology Grisebachstrasse 6 D-37077 Goettingen Germany phone 0049 (0)551 39 8807 fax 0049 (0)551 39 8806 http://www.gwdg.de/~cscherb1
Simon Wood
2013-Jul-16 09:04 UTC
[R] MGCV: overlay fitted (marginal) curves over a plot of the original data
Probably you didn't want to set x0=0:1? Here is some code, to do what you want. (The CI shape is not identical to the plot(b) version as the uncertainty includes the uncertainty in the other smooths and the intercept now.) library(mgcv) set.seed(2) dat <- gamSim(1,n=400,dist="normal",scale=2) b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat) plot(b,select=1) plot(y~x0,dat) mydata=data.frame(x0=0:200/200,x1=mean(dat$x1),x2=mean(dat$x2),x3=mean(dat$x3)) pv <- predict(b,mydata,type="response",se=TRUE) lines(mydata$x0,pv$fit) lines(mydata$x0,pv$fit+2*pv$se.fit,lty=2) lines(mydata$x0,pv$fit-2*pv$se.fit,lty=2) On 16/07/13 09:52, Christoph Scherber wrote:> Dear R users, > > I?ve stumbled over a problem that can be easily seen from the R code below: > > - When I use plot.gam() on a fitted model object, I get a nice and well-looking smooth curve for all > terms in the model. > > - However, when I use predict(model) for a given predictor, with values of all other predictors set > to their means, the resulting curve doesn?t fit well at all. > > Is there a way to "overlay" the curve produced by plot.gam() over a plot of the original data? > > Here?s some reproducible code with mgcv version 1.7-22 on R3.0.1 (Windows 7): > > ## > > library(mgcv) > set.seed(2) > dat <- gamSim(1,n=400,dist="normal",scale=2) > b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat) > plot(b,select=1) > > plot(y~x0,dat) > mydata=data.frame(x0=0:1,x1=mean(dat$x1),x2=mean(dat$x2),x3=mean(dat$x3)) > lines(0:1,predict(b,mydata,type="response")) > > ## > > Best wishes, > Christoph > >