- Define an outcome, this can be of any form, but use an appropriate distribution for your outcome. Also define at least 1 continuous predictor.
I will use data from BRFSS with the outcome variable is general health and the continuous predictor variable will be sleep time.
- Using the gam() function, estimate a model with only linear terms in your model
library(mgcv)
## Loading required package: nlme
##
## Attaching package: 'nlme'
## The following object is masked from 'package:dplyr':
##
## collapse
## This is mgcv 1.8-39. For overview type 'help("mgcv-package")'.
library(ggplot2)
library(dplyr)
dat <- data.frame(brfss2020)
gamfit <- gam(genhealth ~ sleptim1 + checkup1 + educa, data = dat, weights = mmsawt/mean(mmsawt, na.rm=T), family = binomial)
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
summary(gamfit)
##
## Family: binomial
## Link function: logit
##
## Formula:
## genhealth ~ sleptim1 + checkup1 + educa
##
## Parametric coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.587463 0.122241 21.167 < 2e-16 ***
## sleptim1 -0.097657 0.003745 -26.076 < 2e-16 ***
## checkup11last5yrs -0.248483 0.017413 -14.270 < 2e-16 ***
## checkup12never -0.397103 0.069727 -5.695 1.23e-08 ***
## educa2elementary 0.082819 0.124066 0.668 0.504
## educa3somehs -0.110699 0.121673 -0.910 0.363
## educa4hsgrad -0.486922 0.119734 -4.067 4.77e-05 ***
## educa5somecol -0.572138 0.119638 -4.782 1.73e-06 ***
## educa6baorhigher -1.021040 0.119510 -8.544 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## R-sq.(adj) = 0.02 Deviance explained = 1.88%
## UBRE = 0.062364 Scale est. = 1 n = 185745
- Repeat Step 2, but include a smooth term for at least one continuous variable
dat <- data.frame(brfss2020)
gamfitsm <- gam(genhealth ~ s(sleptim1) + checkup1 + educa, data = dat, weights = mmsawt/mean(mmsawt, na.rm=T), family = binomial)
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
summary(gamfitsm)
##
## Family: binomial
## Link function: logit
##
## Formula:
## genhealth ~ s(sleptim1) + checkup1 + educa
##
## Parametric coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.87319 0.11923 15.711 < 2e-16 ***
## checkup11last5yrs -0.25422 0.01746 -14.563 < 2e-16 ***
## checkup12never -0.40985 0.06979 -5.873 4.29e-09 ***
## educa2elementary 0.09944 0.12406 0.802 0.423
## educa3somehs -0.11805 0.12168 -0.970 0.332
## educa4hsgrad -0.47258 0.11974 -3.947 7.92e-05 ***
## educa5somecol -0.55438 0.11965 -4.634 3.60e-06 ***
## educa6baorhigher -0.97341 0.11953 -8.144 3.83e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df Chi.sq p-value
## s(sleptim1) 7.686 8.27 1355 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.0243 Deviance explained = 2.25%
## UBRE = 0.058399 Scale est. = 1 n = 185745
- Test if the model in step 3 is fitting the data better than the purely linear model.
anova(gamfit, gamfitsm, test="Chisq")
- Produce a plot of the smooth effect from the model in step 3
plot(gamfitsm)

LS0tDQp0aXRsZTogIkhvbWV3b3JrIEFzc2lnbm1lbnQgOSINCmF1dGhvcjogIlNlbGVuZSBNLiBHb21leiINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19oZWlnaHQ6IDcNCiAgICBmaWdfd2lkdGg6IDcNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpsaWJyYXJ5KHN1cnZleSkNCmxpYnJhcnkocXVlc3Rpb25yKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCmBgYA0KDQoNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpicmZzczIwMjA8LSByZWFkUkRTKHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2NvcmV5c3BhcmtzL0RFTTcyODMvYmxvYi9tYXN0ZXIvZGF0YS9icmZzczIwc20ucmRzP3Jhdz10cnVlIikpDQoNCm5hbWVzKGJyZnNzMjAyMCkgPC0gdG9sb3dlcihnc3ViKHBhdHRlcm4gPSAiXyIscmVwbGFjZW1lbnQgPSAgIiIseCA9ICBuYW1lcyhicmZzczIwMjApKSkNCg0KYnJmc3MyMDIwJHNsZXB0aW0xW2JyZnNzMjAyMCRzbGVwdGltMT4yNF0gPC0gTkENCg0KYnJmc3MyMDIwJHNleDwtYXMuZmFjdG9yKGlmZWxzZShicmZzczIwMjAkc2V4PT0xLCAiTWFsZSIsICJGZW1hbGUiKSkNCg0KYnJmc3MyMDIwJGJsYWNrPC1SZWNvZGUoYnJmc3MyMDIwJHJhY2VncjMsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjI9MTsgOT1OQTsgZWxzZT0wIikNCmJyZnNzMjAyMCR3aGl0ZTwtUmVjb2RlKGJyZnNzMjAyMCRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxPTE7IDk9TkE7IGVsc2U9MCIpDQpicmZzczIwMjAkb3RoZXI8LVJlY29kZShicmZzczIwMjAkcmFjZWdyMywNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMzo0PTE7IDk9TkE7IGVsc2U9MCIpDQpicmZzczIwMjAkaGlzcGFuaWM8LVJlY29kZShicmZzczIwMjAkcmFjZWdyMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iNT0xOyA5PU5BOyBlbHNlPTAiKQ0KDQpicmZzczIwMjAkcmFjZWV0aDwtUmVjb2RlKGJyZnNzMjAyMCRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxPSduaHdoaXRlJzsgMj0nbmhibGFjayc7IDM9J25ob3RoZXInOzQ9J25obXVsdGknOyA1PSdoaXNwYW5pYyc7IGVsc2U9TkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5mYWN0b3IgPSBUKQ0KDQpicmZzczIwMjAkY2hlY2t1cDE8LVJlY29kZShicmZzczIwMjAkY2hlY2t1cDEsDQogICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxOjI9JzBsYXN0Mnlycyc7IDM6ND0nMWxhc3Q1eXJzJzsgOD0nMm5ldmVyJzsgNz1OQTsgOT1OQSIsDQogICAgICAgICAgICAgICAgICAgICBhcy5mYWN0b3I9VCkNCmJyZnNzMjAyMCRjaGVja3VwMTwtZmN0X3JlbGV2ZWwoYnJmc3MyMDIwJGNoZWNrdXAxLCcwbGFzdDJ5cnMnLCcxbGFzdDV5cnMnLCcybmV2ZXInKSANCg0KYnJmc3MyMDIwJGdlbmhlYWx0aDwtUmVjb2RlKGJyZnNzMjAyMCRnZW5obHRoLCByZWNvZGVzPSIxPTE7IDI9MjsgMz0zOyA0PTQ7IDU9NTsgOT1OQTsgZWxzZT1OQSIsIGFzLmZhY3Rvcj1UKQ0KDQpicmZzczIwMjAkZWR1Y2EgPC0gUmVjb2RlKGJyZnNzMjAyMCRlZHVjYSwgcmVjb2Rlcz0iMT0nMW5vc2Nob29sJzsgMj0nMmVsZW1lbnRhcnknOyAzPSczc29tZWhzJzsgND0nNGhzZ3JhZCc7IDU9JzVzb21lY29sJzsgNj0nNmJhb3JoaWdoZXInOyBlbHNlPU5BIiwgYXMuZmFjdG9yPVQpDQoNCg0KaW5zdGFsbC5wYWNrYWdlcygibWFncml0dHIiLCByZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikNCmxpYnJhcnkobWFncml0dHIpDQoNCmJyZnNzMjAyMDwtYnJmc3MyMDIwICU+JQ0KICANCiAgZmlsdGVyKHNleCE9OSwNCiAgICAgICAgIGlzLm5hKHNsZXB0aW0xKT09RiwNCiAgICAgICAgIGlzLm5hKGdlbmhlYWx0aCk9PUYsDQogICAgICAgICBpcy5uYShlZHVjYSk9PUYsDQogICAgICAgICBpcy5uYShjaGVja3VwMSk9PUYsDQogICAgICAgICBpcy5uYShyYWNlZXRoKT09RikNCg0KYnJmc3MyMDIwICU+JSBkcm9wX25hKCkNCg0Kb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQ0KDQpkZXM8LXN2eWRlc2lnbihpZHM9fjEsIHN0cmF0YT1+c3RzdHIsIHdlaWdodHM9fm1tc2F3dCwgZGF0YSA9IGJyZnNzMjAyMCApDQpkZXMNCmBgYA0KDQoNCjEpIERlZmluZSBhbiBvdXRjb21lLCB0aGlzIGNhbiBiZSBvZiBhbnkgZm9ybSwgYnV0IHVzZSBhbiBhcHByb3ByaWF0ZSBkaXN0cmlidXRpb24gZm9yIHlvdXIgb3V0Y29tZS4gQWxzbyBkZWZpbmUgYXQgbGVhc3QgMSBjb250aW51b3VzIHByZWRpY3Rvci4NCg0KSSB3aWxsIHVzZSBkYXRhIGZyb20gQlJGU1Mgd2l0aCB0aGUgb3V0Y29tZSB2YXJpYWJsZSBpcyBnZW5lcmFsIGhlYWx0aCBhbmQgdGhlIGNvbnRpbnVvdXMgcHJlZGljdG9yIHZhcmlhYmxlIHdpbGwgYmUgc2xlZXAgdGltZS4NCg0KMikgVXNpbmcgdGhlIGdhbSgpIGZ1bmN0aW9uLCBlc3RpbWF0ZSBhIG1vZGVsIHdpdGggb25seSBsaW5lYXIgdGVybXMgaW4geW91ciBtb2RlbA0KDQpgYGB7cn0NCmxpYnJhcnkobWdjdikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCmRhdCA8LSBkYXRhLmZyYW1lKGJyZnNzMjAyMCkNCg0KZ2FtZml0IDwtIGdhbShnZW5oZWFsdGggfiBzbGVwdGltMSArIGNoZWNrdXAxICsgZWR1Y2EsIGRhdGEgPSBkYXQsIHdlaWdodHMgPSBtbXNhd3QvbWVhbihtbXNhd3QsIG5hLnJtPVQpLCBmYW1pbHkgPSBiaW5vbWlhbCkNCg0Kc3VtbWFyeShnYW1maXQpDQoNCmBgYA0KDQozKSBSZXBlYXQgU3RlcCAyLCBidXQgaW5jbHVkZSBhIHNtb290aCB0ZXJtIGZvciBhdCBsZWFzdCBvbmUgY29udGludW91cyB2YXJpYWJsZQ0KDQpgYGB7cn0NCmRhdCA8LSBkYXRhLmZyYW1lKGJyZnNzMjAyMCkNCg0KZ2FtZml0c20gPC0gZ2FtKGdlbmhlYWx0aCB+IHMoc2xlcHRpbTEpICsgY2hlY2t1cDEgKyBlZHVjYSwgZGF0YSA9IGRhdCwgd2VpZ2h0cyA9IG1tc2F3dC9tZWFuKG1tc2F3dCwgbmEucm09VCksIGZhbWlseSA9IGJpbm9taWFsKQ0KDQpzdW1tYXJ5KGdhbWZpdHNtKQ0KDQpgYGANCg0KDQo0KSBUZXN0IGlmIHRoZSBtb2RlbCBpbiBzdGVwIDMgaXMgZml0dGluZyB0aGUgZGF0YSBiZXR0ZXIgdGhhbiB0aGUgcHVyZWx5IGxpbmVhciBtb2RlbC4NCg0KYGBge3J9DQphbm92YShnYW1maXQsIGdhbWZpdHNtLCB0ZXN0PSJDaGlzcSIpDQoNCmBgYA0KDQo1KSBQcm9kdWNlIGEgcGxvdCBvZiB0aGUgc21vb3RoIGVmZmVjdCBmcm9tIHRoZSBtb2RlbCBpbiBzdGVwIDMNCg0KYGBge3J9DQpwbG90KGdhbWZpdHNtKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg==