--- title: 'GAM' output: html_document date: "2023-11-15" --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ```{r simulated data} n=200 x=sort(runif(n,0,1)) x=seq(0,1,length=n) truef=function(x) sin(2*pi*x) my=truef(x) signaltonoise=2 simula=function(signalnoise=signaltonoise){ y=rnorm(n,my,sd=sd(my)/signalnoise) return(data.frame(x=x,y=y,truef=my)) } d=simula() plot(d$x,d$y) ``` ```{r} library(mgcv) fit=gam(y~s(x),data=d) fit3=gam(y~s(x,k=3),data=d) fit50=gam(y~s(x,k=50),data=d) plot(fit) ``` ```{r} plot(fit,residuals=TRUE,pch=20) ``` - partial residuals are weighted working residuals from PIRLS added to the spline (systematic departure from fj indicates a problem) - Rug plot shows values of predictors. - EDF for term reported in y axis lable. - 95% Bayesian CIs shown. Some more options for {\tt plot.gam} ```{r} plot(fit,shade=TRUE,seWithMean = TRUE,scale=0) ``` ```{r} gam.check(fit) ``` ## choice of k Increase k to see ```{r} fit=gam(y~s(x,k=10),data=d) fit=gam(y~s(x,k=20),data=d) ``` Check for unmodeled patterns in the residuals ```{r} fit=gam(y~s(x,k=3),data=d) rsd <- residuals(fit,type="deviance") fit.res=gam(rsd~s(x,k=20)-1,data=d,select=TRUE) ``` ```{r} fit=gam(y~s(x,k=20),data=d) rsd <- residuals(fit,type="deviance") fit.res=gam(rsd~s(x,k=20)-1,data=d,select=TRUE) ``` ## Smoothness selection ```{r} fit1=gam(y~s(x,k=20),data=d,method="GCV.Cp") fit2=gam(y~s(x,k=20),data=d,method="REML") fit3=gam(y~s(x,k=20),data=d,method="ML") plot(d$x,d$y) curve(predict(fit1,newdata=data.frame(x=x)),add=TRUE) curve(predict(fit2,newdata=data.frame(x=x)),add=TRUE,col="red") curve(predict(fit3,newdata=data.frame(x=x)),add=TRUE,col="green") ``` ## Model inference ```{r} summary(fit) ``` ```{r} anova(fit) ``` ```{r} beta.hat=coef(fit) beta.vcov=vcov(fit) beta.vcov.freq=vcov(fit,freq=TRUE) ``` ## More (smooth) covariates ```{r} dat <- gamSim(1,n=400,dist="normal",scale=2) fit=gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat) ``` ```{r} par(mfrow=c(1,4)) plot(fit) ``` ```{r} par(mfrow=c(1,4)) plot(fit,scale=0) ``` ```{r} vis.gam(fit,view=c("x1","x2"),theta=30,se=2) ```