library("gamlss2")
## packages, code, and data
library("distributions3")
data("cars", package = "datasets")
## fit heteroscedastic normal GAMLSS model
## stopping distance (ft) explained by speed (mph)
m <- gamlss2(dist ~ s(speed) | s(speed), data = cars, family = NO)GAMLSS-RS iteration 1: Global Deviance = 407.3647 eps = 0.125474
GAMLSS-RS iteration 2: Global Deviance = 406.1879 eps = 0.002888
GAMLSS-RS iteration 3: Global Deviance = 406.1521 eps = 0.000088
GAMLSS-RS iteration 4: Global Deviance = 406.1491 eps = 0.000007
## obtain predicted distributions for three levels of speed
d <- prodist(m, newdata = data.frame(speed = c(10, 20, 30)))
print(d) 1 2
"GDF NO(mu = 23.29, sigma = 10.11)" "GDF NO(mu = 58.71, sigma = 18.60)"
3
"GDF NO(mu = 94.13, sigma = 34.21)"
## obtain quantiles (works the same for any distribution object 'd' !)
quantile(d, 0.5) 1 2 3
23.28681 58.70678 94.12851
quantile(d, c(0.05, 0.5, 0.95), elementwise = FALSE) q_0.05 q_0.5 q_0.95
1 6.660745 23.28681 39.91288
2 28.117328 58.70678 89.29623
3 37.863044 94.12851 150.39398
quantile(d, c(0.05, 0.5, 0.95), elementwise = TRUE) 1 2 3
6.660745 58.706778 150.393985
## visualization
plot(dist ~ speed, data = cars)
nd <- data.frame(speed = 0:240/4)
nd$dist <- prodist(m, newdata = nd)
nd$fit <- quantile(nd$dist, c(0.05, 0.5, 0.95))
matplot(nd$speed, nd$fit, type = "l", lty = 1, col = "slategray", add = TRUE)
## moments
mean(d) 1 2 3
23.28681 58.70678 94.12851
variance(d) 1 2 3
102.1703 345.8508 1170.1173
## simulate random numbers
random(d, 5) r_1 r_2 r_3 r_4 r_5
1 31.46146 -0.03983743 36.22054 28.28792 3.230608
2 46.03940 81.83797745 65.79318 44.30638 54.715483
3 112.66001 116.30619679 76.26833 119.85856 105.993169
## density and distribution
pdf(d, 50 * -2:2) d_-100 d_-50 d_0 d_50 d_100
1 1.957744e-34 1.517418e-13 0.0027779484 0.001201193 1.226794e-14
2 3.287990e-18 8.163864e-10 0.0001470760 0.019225098 1.823375e-03
3 1.183451e-09 1.628516e-06 0.0002645741 0.005074764 1.149206e-02
cdf(d, 50 * -2:2) p_-100 p_-50 p_0 p_50 p_100
1 1.611730e-34 2.077317e-13 0.0106164934 0.99588875 1.0000000
2 7.070541e-18 2.527177e-09 0.0007976179 0.31982786 0.9868047
3 6.929792e-09 1.257638e-05 0.0029640291 0.09851764 0.5681420
## Poisson example
data("FIFA2018", package = "distributions3")
m2 <- gamlss2(goals ~ s(difference), data = FIFA2018, family = PO)GAMLSS-RS iteration 1: Global Deviance = 355.3922 eps = 0.045332
GAMLSS-RS iteration 2: Global Deviance = 355.3922 eps = 0.000000
d2 <- prodist(m2, newdata = data.frame(difference = 0))
print(d2) 1
"GDF PO(mu = 1.237)"
quantile(d2, c(0.05, 0.5, 0.95))[1] 0 1 3
## note that log_pdf() can replicate logLik() value
sum(log_pdf(prodist(m2), FIFA2018$goals))[1] -177.6961
logLik(m2)'log Lik.' -177.6961 (df=2.005144)