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.