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@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

______________________________________________
R-help@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.

Reply via email to