library("gamlss2")
## air quality data
air <- subset(airquality, !is.na(Ozone))
## positive skewed response
hist(air$Ozone)
## specify a distributional model
f <- Ozone ~ s(Temp) + s(Wind) | s(Temp)
## estimate model
m1 <- gamlss2(f, data = air, family = GA)GAMLSS-RS iteration 1: Global Deviance = 909.151 eps = 0.173776
GAMLSS-RS iteration 2: Global Deviance = 901.5501 eps = 0.008360
GAMLSS-RS iteration 3: Global Deviance = 901.1446 eps = 0.000449
GAMLSS-RS iteration 4: Global Deviance = 901.1033 eps = 0.000045
GAMLSS-RS iteration 5: Global Deviance = 901.0673 eps = 0.000039
GAMLSS-RS iteration 6: Global Deviance = 901.036 eps = 0.000034
GAMLSS-RS iteration 7: Global Deviance = 901.0085 eps = 0.000030
GAMLSS-RS iteration 8: Global Deviance = 900.9843 eps = 0.000026
GAMLSS-RS iteration 9: Global Deviance = 900.963 eps = 0.000023
GAMLSS-RS iteration 10: Global Deviance = 900.9442 eps = 0.000020
GAMLSS-RS iteration 11: Global Deviance = 900.9275 eps = 0.000018
GAMLSS-RS iteration 12: Global Deviance = 900.9126 eps = 0.000016
GAMLSS-RS iteration 13: Global Deviance = 900.8994 eps = 0.000014
GAMLSS-RS iteration 14: Global Deviance = 900.8875 eps = 0.000013
GAMLSS-RS iteration 15: Global Deviance = 900.8768 eps = 0.000011
GAMLSS-RS iteration 16: Global Deviance = 900.8672 eps = 0.000010
GAMLSS-RS iteration 17: Global Deviance = 900.8585 eps = 0.000009
## model summary
summary(m1)Call:
gamlss2(formula = f, data = air, family = GA)
---
Family: GA
Link functions: log, log
*--------
Coefficients:
Estimate Std. Error t value Pr(>|t|)
mu.(Intercept) 3.52962 0.02099 168.19 <2e-16 ***
sigma.(Intercept) -0.98746 0.06363 -15.52 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
---
Smooth terms:
mu.s(Temp) mu.s(Wind) sigma.s(Temp)
edf 7.9120 3.1873 7.5602
*--------
n = 116 df = 20.66 res.df = 95.34
Deviance = 900.8585 Null Dev. Red. = 16.82%
AIC = 942.1774 elapsed = 0.23sec
## plot parameter-specific effects
plot(m1, which = "effects")
## plot diagnostics
plot(m1, which = "resid")
## predict distribution parameters
par <- predict(m1, parameter = c("mu", "sigma"))
print(head(par)) mu sigma
1 28.60531 0.3717324
2 18.98143 0.4718580
3 13.92848 0.3693678
4 14.93042 0.5548871
6 19.23528 0.3498466
7 23.06716 0.3551156
## create new data:
## vary temperature while holding wind constant
nd <- with(air, data.frame(
Temp = seq(min(Temp), max(Temp), length.out = 100),
Wind = median(Wind)
))
## fitted conditional quantiles
pq <- quantile(
m1,
newdata = nd,
probs = c(0.05, 0.5, 0.95)
)
## visualize
plot(Ozone ~ Temp, data = air, pch = 19,
col = rgb(0.1, 0.1, 0.1, alpha = 0.3),
xlab = "Temperature (degrees F)",
ylab = "Ozone (ppb)")
matlines(nd$Temp, pq,
lwd = 2,
lty = c(2, 1, 2),
col = 4)
## exceedance probabilities
nd5 <- with(air, data.frame(
Temp = seq(min(Temp), max(Temp), length.out = 5),
Wind = min(Wind)
))
par <- predict(m1, newdata = nd5)
nd5$Probs <- 1 - family(m1)$cdf(par, 90)
barplot(
nd5$Probs,
names.arg = round(nd5$Temp),
xlab = "Temperature (degrees F)",
ylab = "Pr(Ozone > 90 ppb)",
ylim = c(0, 1)
)
## count response example using HarzTraffic data
data("HarzTraffic", package = "gamlss2")
## seasonal count model for motorcycles
m2 <- gamlss2(
bikes ~ s(yday, bs = "cc") | s(yday, bs = "cc"),
data = HarzTraffic,
family = NBI
)GAMLSS-RS iteration 1: Global Deviance = 10151.1432 eps = 0.149402
GAMLSS-RS iteration 2: Global Deviance = 10150.8948 eps = 0.000024
GAMLSS-RS iteration 3: Global Deviance = 10150.8818 eps = 0.000001
## summary
summary(m2)Call:
gamlss2(formula = bikes ~ s(yday, bs = "cc") | s(yday, bs = "cc"),
data = HarzTraffic, family = NBI)
---
Family: NBI
Link functions: log, log
*--------
Coefficients:
Estimate Std. Error t value Pr(>|t|)
mu.(Intercept) 3.99347 0.03062 130.43 <2e-16 ***
sigma.(Intercept) 0.46777 0.04416 10.59 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
---
Smooth terms:
mu.s(yday) sigma.s(yday)
edf 6.3823 6.2095
*--------
n = 1057 df = 14.59 res.df = 1042.41
Deviance = 10150.8818 Null Dev. Red. = 12.62%
AIC = 10180.0654 elapsed = 0.08sec
## effect plots
plot(m2)
## residual diagnostics
plot(m2, which = "resid")
## quantiles over the day of the year
nd <- data.frame(yday = 1:365)
pq <- quantile(m2, newdata = nd, probs = c(0.05, 0.5, 0.95))
## visualize fitted quantiles
plot(bikes ~ yday, data = HarzTraffic, pch = 19,
col = gray(0.1, alpha = 0.3))
matlines(nd$yday, pq, lty = c(2, 1, 2),
lwd = 2, col = 4)