using Random, Copulas, Distributions, CairoMakie
let
X₁ = Gamma(2.0, 3.0)
X₂ = Pareto(3.0, 1.0)
X₃ = LogNormal(0.0, 1.0)
C = ClaytonCopula(3, 0.7) # A 3-variate Clayton Copula with θ = 0.7
D = SklarDist(C, (X₁, X₂, X₃)) # The final distribution
# Generate a dataset (returns dimensions × observations)
simu = rand(D, 1000)
# Estimate marginals by MLE
d̂1 = fit(Gamma, simu[1, :])
d̂2 = fit(Pareto, simu[2, :])
d̂3 = fit(LogNormal, simu[3, :])
# Probability integral transform to uniforms
Û = permutedims(
hcat(cdf.(d̂1, simu[1, :]), cdf.(d̂2, simu[2, :]), cdf.(d̂3, simu[3, :]))
)
# Fit copula on uniforms
Ĉ = fit(ClaytonCopula, Û)
# Compose the estimated Sklar distribution
D̂ = SklarDist(Ĉ, (d̂1, d̂2, d̂3))
# Generate new samples from the fitted distribution
simu_fitted = rand(D̂, 1000)
# Create visualizations
fig = Figure(size=(1000, 800))
# Plot pairwise scatter plots
ax1 = Axis(fig[1, 1], xlabel="X₁ (Gamma)", ylabel="X₂ (Pareto)",
title="Original Data")
scatter!(ax1, simu[1, :], simu[2, :], markersize=3, color=:steelblue,
alpha=0.5)
ax2 = Axis(fig[1, 2], xlabel="X₁ (Gamma)", ylabel="X₂ (Pareto)",
title="Fitted Distribution")
scatter!(ax2, simu_fitted[1, :], simu_fitted[2, :], markersize=3,
color=:coral, alpha=0.5)
ax3 = Axis(fig[2, 1], xlabel="X₁ (Gamma)", ylabel="X₃ (LogNormal)")
scatter!(ax3, simu[1, :], simu[3, :], markersize=3, color=:steelblue, alpha=0.5)
ax4 = Axis(fig[2, 2], xlabel="X₁ (Gamma)", ylabel="X₃ (LogNormal)")
scatter!(ax4, simu_fitted[1, :], simu_fitted[3, :], markersize=3,
color=:coral, alpha=0.5)
ax5 = Axis(fig[3, 1], xlabel="X₂ (Pareto)", ylabel="X₃ (LogNormal)")
scatter!(ax5, simu[2, :], simu[3, :], markersize=3, color=:steelblue, alpha=0.5)
ax6 = Axis(fig[3, 2], xlabel="X₂ (Pareto)", ylabel="X₃ (LogNormal)")
scatter!(ax6, simu_fitted[2, :], simu_fitted[3, :], markersize=3,
color=:coral, alpha=0.5)
fig
end