The pbox
package is designed for probabilistic modeling
and scenario analysis using Probability Boxes (p-boxes). This vignette
demonstrates the main functions of the pbox
package, from
loading and visualizing data to creating and querying a
pbox
object.
First, we load the SEAex
dataset included in the
pbox
package. We add a Year column and then reshape the
data for plotting.
library(pbox)
#> Loading required package: gamlss.dist
#> Registered S3 method overwritten by 'quantmod':
#> method from
#> as.zoo.data.frame zoo
library(data.table)
library(ggplot2)
data("SEAex", package = "pbox")
SEAex$Year <- 1901:2022
SEAex_long <- melt(SEAex, id.vars = "Year", variable.name = "Country")
We use ggplot2
to create a time series plot of the
temperature data for each country.
ggplot(SEAex_long, aes(x = Year, y = value, color = Country)) +
geom_line(color = "black") + # Set all lines to black
labs(x = "Year", y = "Temperature °C") +
ggtitle("") +
facet_grid(Country ~ ., scales = "free_y") +
theme(legend.position = "none", panel.spacing.y = unit(10, "pt")) +
theme_bw()
We create a pbox
object from the SEAex
dataset using the set_pbox
function.
# Set pbox
pbx <- set_pbox(SEAex)
#> It seems your data might not be stationary!
#> | | | 0% | |= | 2% | |=== | 4% | |==== | 6% | |===== | 8% | |======= | 10% | |======== | 12% | |========== | 14% | |=========== | 16% | |============ | 18% | |============== | 20% | |=============== | 22% | |================ | 24% | |================== | 25% | |=================== | 27% | |===================== | 29% | |====================== | 31% | |======================= | 33% | |========================= | 35% | |========================== | 37% | |=========================== | 39% | |============================= | 41% | |============================== | 43% | |================================ | 45% | |================================= | 47% | |================================== | 49% | |==================================== | 51% | |===================================== | 53% | |====================================== | 55% | |======================================== | 57% | |========================================= | 59% | |=========================================== | 61% | |============================================ | 63% | |============================================= | 65% | |=============================================== | 67% | |================================================ | 69% | |================================================= | 71%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[1,1] = 0
#> | |=================================================== | 73% | |==================================================== | 75% | |====================================================== | 76% | |======================================================= | 78% | |======================================================== | 80% | |========================================================== | 82% | |=========================================================== | 84% | |============================================================ | 86% | |============================================================== | 88% | |=============================================================== | 90% | |================================================================= | 92% | |================================================================== | 94% | |=================================================================== | 96% | |===================================================================== | 98% | |======================================================================| 100%
#> | | | 0% | |= | 2% | |=== | 4% | |==== | 6% | |===== | 8% | |======= | 10% | |======== | 12% | |========== | 14% | |=========== | 16% | |============ | 18% | |============== | 20% | |=============== | 22% | |================ | 24% | |================== | 25% | |=================== | 27% | |===================== | 29% | |====================== | 31% | |======================= | 33% | |========================= | 35% | |========================== | 37% | |=========================== | 39% | |============================= | 41% | |============================== | 43% | |================================ | 45% | |================================= | 47% | |================================== | 49% | |==================================== | 51% | |===================================== | 53% | |====================================== | 55% | |======================================== | 57% | |========================================= | 59% | |=========================================== | 61% | |============================================ | 63% | |============================================= | 65% | |=============================================== | 67% | |================================================ | 69% | |================================================= | 71%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[1,1] = 0
#> | |=================================================== | 73% | |==================================================== | 75% | |====================================================== | 76% | |======================================================= | 78% | |======================================================== | 80% | |========================================================== | 82% | |=========================================================== | 84% | |============================================================ | 86% | |============================================================== | 88% | |=============================================================== | 90% | |================================================================= | 92% | |================================================================== | 94% | |=================================================================== | 96% | |===================================================================== | 98% | |======================================================================| 100%
#> | | | 0% | |= | 2% | |=== | 4% | |==== | 6% | |===== | 8% | |======= | 10% | |======== | 12% | |========== | 14% | |=========== | 16% | |============ | 18% | |============== | 20% | |=============== | 22% | |================ | 24% | |================== | 25% | |=================== | 27% | |===================== | 29% | |====================== | 31% | |======================= | 33% | |========================= | 35% | |========================== | 37% | |=========================== | 39% | |============================= | 41% | |============================== | 43% | |================================ | 45%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================= | 47%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================== | 49%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |==================================== | 51% | |===================================== | 53% | |====================================== | 55% | |======================================== | 57% | |========================================= | 59% | |=========================================== | 61% | |============================================ | 63% | |============================================= | 65% | |=============================================== | 67% | |================================================ | 69% | |================================================= | 71%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[1,1] = 0
#> | |=================================================== | 73% | |==================================================== | 75% | |====================================================== | 76% | |======================================================= | 78% | |======================================================== | 80% | |========================================================== | 82% | |=========================================================== | 84% | |============================================================ | 86% | |============================================================== | 88% | |=============================================================== | 90% | |================================================================= | 92%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================================================== | 94% | |=================================================================== | 96% | |===================================================================== | 98% | |======================================================================| 100%
#> | | | 0% | |= | 2% | |=== | 4% | |==== | 6% | |===== | 8% | |======= | 10% | |======== | 12% | |========== | 14% | |=========== | 16% | |============ | 18% | |============== | 20% | |=============== | 22% | |================ | 24% | |================== | 25% | |=================== | 27% | |===================== | 29% | |====================== | 31% | |======================= | 33% | |========================= | 35% | |========================== | 37% | |=========================== | 39% | |============================= | 41% | |============================== | 43% | |================================ | 45%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================= | 47%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================== | 49% | |==================================== | 51% | |===================================== | 53% | |====================================== | 55% | |======================================== | 57% | |========================================= | 59% | |=========================================== | 61% | |============================================ | 63% | |============================================= | 65% | |=============================================== | 67% | |================================================ | 69% | |================================================= | 71%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[1,1] = 0
#> | |=================================================== | 73% | |==================================================== | 75% | |====================================================== | 76% | |======================================================= | 78% | |======================================================== | 80% | |========================================================== | 82% | |=========================================================== | 84% | |============================================================ | 86% | |============================================================== | 88% | |=============================================================== | 90% | |================================================================= | 92% | |================================================================== | 94% | |=================================================================== | 96% | |===================================================================== | 98% | |======================================================================| 100%
#> | | | 0% | |= | 2% | |=== | 4% | |==== | 6% | |===== | 8% | |======= | 10% | |======== | 12%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[3,3] = 0
#> | |========== | 14% | |=========== | 16% | |============ | 18% | |============== | 20% | |=============== | 22% | |================ | 24%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[3,3] = 0
#> | |================== | 25% | |=================== | 27% | |===================== | 29% | |====================== | 31% | |======================= | 33% | |========================= | 35% | |========================== | 37% | |=========================== | 39% | |============================= | 41% | |============================== | 43% | |================================ | 45%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================= | 47%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================== | 49%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |==================================== | 51%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[3,3] = 0
#> | |===================================== | 53% | |====================================== | 55% | |======================================== | 57% | |========================================= | 59% | |=========================================== | 61% | |============================================ | 63% | |============================================= | 65% | |=============================================== | 67% | |================================================ | 69% | |================================================= | 71%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[1,1] = 0
#> | |=================================================== | 73% | |==================================================== | 75% | |====================================================== | 76% | |======================================================= | 78% | |======================================================== | 80% | |========================================================== | 82% | |=========================================================== | 84% | |============================================================ | 86% | |============================================================== | 88% | |=============================================================== | 90% | |================================================================= | 92%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |================================================================== | 94%Error in solve.default(oout$hessian) :
#> Lapack routine dgesv: system is exactly singular: U[4,4] = 0
#> | |=================================================================== | 96% | |===================================================================== | 98% | |======================================================================| 100%
#>
#>
#> ---Final fitted copula---
#> Copula Type: ellipCopula
#> Family: normal
#> parameter: 0.4568983
#> --------------------------
#> pbox object generated!
print(pbx)
#> Probabilistic Box Object of class pbox
#>
#> ||--General Overview--||
#> ----------------
#> 1)Data Structure
#> Number of Rows: 122
#> Number of Columns: 5
#>
#> 1.1)Variable Statistics:
#> var min max mean median
#> <char> <num> <num> <num> <num>
#> 1: Malaysia 30.50 32.30 31.24344 31.20
#> 2: Thailand 33.20 37.30 35.10656 35.10
#> 3: Vietnam 30.90 32.90 31.63934 31.60
#> 4: avgRegion 25.21 26.66 25.78951 25.73
#> 5: Year 1901.00 2022.00 1961.50000 1961.50
#>
#> ----------------
#> 2)Copula Summary:
#> Type: ellipCopula
#> Normal copula, dim. d = 5
#> Dimension: 5
#> Parameters:
#> rho.1 = 0.4568983
#> dispstr: ex
#>
#> 2.1)Copula margins:
#> [1] "RG" "SN1" "RG" "RG" "SHASHo"
#> 2.2)Kendall correlation:
#> Malaysia Thailand Vietnam avgRegion Year
#> Malaysia 1.0000000 0.175537766 0.3864290 0.5751234 0.377308066
#> Thailand 0.1755378 1.000000000 0.2246915 0.2472509 0.001384308
#> Vietnam 0.3864290 0.224691517 1.0000000 0.4424894 0.280789004
#> avgRegion 0.5751234 0.247250903 0.4424894 1.0000000 0.422692241
#> Year 0.3773081 0.001384308 0.2807890 0.4226922 1.000000000
#>
#> -------------------------------
We can query the probabilistic space of the pbox object using the qpbox function. Below are examples of different types of queries.
# Marginal Distribution
qpbox(pbx, mj = "Malaysia:33")
#> P
#> 0.9986981
# Joint Distribution
qpbox(pbx, mj = "Malaysia:33 & Vietnam:34")
#> P
#> 0.9981035
# Conditional Distribution
qpbox(pbx, mj = "Vietnam:31", co = "avgRegion:26")
#> P
#> 0.03647037
#Conditional Distribution with Fixed Conditions
qpbox(pbx, mj = "Malaysia:33 & Vietnam:31", co = "avgRegion:26", fixed = TRUE)
#> P
#> 0.9688897
#Joint Distribution with Mean Values
qpbox(pbx, mj = "mean:c(Vietnam, Thailand)", lower.tail = TRUE)
#> P
#> 0.3740338
# Joint Distribution with Median Values
qpbox(pbx, mj = "median:c(Vietnam, Thailand)", lower.tail = TRUE)
#> P
#> 0.353339
# Joint Distribution with Specific Values
qpbox(pbx, mj = "Malaysia:33 & mean:c(Vietnam, Thailand)", lower.tail = TRUE)
#> P
#> 0.3740201
# Conditional Distribution with Mean Conditions
qpbox(pbx, mj = "Malaysia:33 & median:c(Vietnam,Thailand)", co = "mean:c(avgRegion)")
#> P
#> 0.6217401
We can perform a grid search to explore the probabilistic space over a grid of values.
grid_results <- grid_pbox(pbx, mj = c("Vietnam", "Malaysia"))
print(grid_results)
#> Vietnam Malaysia probs
#> <num> <num> <list>
#> 1: 30.9 30.5 0.0001235705
#> 2: 31.2 30.5 0.0004576423
#> 3: 31.3 30.5 0.0005318575
#> 4: 31.4 30.5 0.0005801543
#> 5: 31.5 30.5 0.0006092625
#> ---
#> 117: 31.7 32.3 0.620192
#> 118: 31.8 32.3 0.6975326
#> 119: 32.0 32.3 0.8132672
#> 120: 32.3 32.3 0.9104411
#> 121: 32.9 32.3 0.9725093
print(grid_results[which.max(grid_results$probs),])
#> Vietnam Malaysia probs
#> <num> <num> <list>
#> 1: 32.9 32.3 0.9725093
print(grid_results[which.min(grid_results$probs),])
#> Vietnam Malaysia probs
#> <num> <num> <list>
#> 1: 30.9 30.5 0.0001235705
We perform scenario analysis by modifying underlying parameters of the pbox object.
scenario_results <- scenario_pbox(pbx, mj = "Vietnam:31 & avgRegion:26", param_list = list(Vietnam = "mu"))
print(scenario_results)
#> $`SD-3`
#> P
#> 0.09561431
#>
#> $`SD-2`
#> P
#> 0.06737206
#>
#> $`SD-1`
#> P
#> 0.04488868
#>
#> $SD0
#> P
#> 0.02803826
#>
#> $SD1
#> P
#> 0.016256
#>
#> $SD2
#> P
#> 0.008648929
#>
#> $SD3
#> P
#> 0.004167532
This vignette demonstrates the main functionalities of the
pbox
package, including data preparation, visualization,
probabilistic querying, and scenario analysis. The pbox
package provides powerful tools for probabilistic modeling and analysis,
making it a valuable asset for risk assessment and decision-making
applications.