[R] physical constraint with gam
Simon Wood
simon.wood at bath.edu
Wed May 11 11:11:12 CEST 2016
The spline having a positive value is not the same as a glm coefficient
having a positive value. When you plot a smooth, say s(x), that is
equivalent to plotting the line 'beta * x' in a GLM. It is not
equivalent to plotting 'beta'. The smooths in a gam are (usually)
subject to `sum-to-zero' identifiability constraints to avoid
confounding via the intercept, so they are bound to be negative over
some part of the covariate range. For example, if I have a model y ~
s(x) + s(z), I can't estimate the mean level for s(x) and the mean level
for s(z) as they are completely confounded, and confounded with the
model intercept term.
I suppose that if you want to interpret the smooths as glm parameters
varying with the covariate they relate to then you can do, by setting
the model up as a varying coefficient model, using the `by' argument to
's'...
gam(snowdepth~s(fsca,by=fsca),data=dat)
this model is `snowdepth_i = f(fsca_i) * fsca_i + e_i' . s(fsca,by=fsca)
is not confounded with the intercept, so no constraint is needed or
applied, and you can now interpret the smooth like a local GLM coefficient.
best,
Simon
On 11/05/16 01:30, Dominik Schneider wrote:
> Hi,
> Just getting into using GAM using the mgcv package. I've generated some
> models and extracted the splines for each of the variables and started
> visualizing them. I'm noticing that one of my variables is physically
> unrealistic.
>
> In the example below, my interpretation of the following plot is that the
> y-axis is basically the equivalent of a "parameter" value of a GLM; in GAM
> this value can change as the functional relationship changes between x and
> y. In my case, I am predicting snowdepth based on the fractional snow
> covered area. In no case will snowdepth realistically decrease for a unit
> increase in fsca so my question is: *Is there a way to constrain the spline
> to positive values? *
>
> Thanks
> Dominik
>
> library(mgcv)
> library(dplyr)
> library(ggplot2)
> extract_splines=function(mdl){
> sterms=predict(mdl,type='terms')
> datplot=cbind(sterms,mdl$model) %>% tbl_df
> datplot$intercept=attr(sterms,'constant')
> datplot$yhat=rowSums(sterms)+attr(sterms,'constant')
> return(datplot)
> }
> dat=data_frame(snowdepth=runif(100,min =
> 0.001,max=6.7),fsca=runif(100,0.01,.99))
> mdl=gam(snowdepth~s(fsca),data=dat)
> termdF=extract_splines(mdl)
> ggplot(termdF)+
> geom_line(aes(x=fsca,y=`s(fsca)`))
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
--
Simon Wood, School of Mathematics, University of Bristol BS8 1TW UK
+44 (0)117 33 18273 http://www.maths.bris.ac.uk/~sw15190
More information about the R-help
mailing list