Skip to content

Commit b0ef2f9

Browse files
authored
feat(api): Add pointwise_conditional_loglikelihoods. Deprecate pointwise_loglikelihoods. (#88)
* docs: Don't recommend overloading pointwise_loglikelihoods
1 parent 5c051c3 commit b0ef2f9

5 files changed

Lines changed: 25 additions & 40 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212

1313
### Documentation
1414

15+
## v0.4.6 (2026-02-03)
16+
17+
### Features
18+
19+
- Add `pointwise_conditional_loglikelihoods`. Deprecate `pointwise_loglikelihoods`. ([#88](https://github.com/arviz-devs/PosteriorStats.jl/pull/88))
20+
1521
## v0.4.5 (2026-02-03)
1622

1723
### Maintenance

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "PosteriorStats"
22
uuid = "7f36be82-ad55-44ba-a5c0-b8b5480d7aa5"
33
authors = ["Seth Axen <seth@sethaxen.com> and contributors"]
4-
version = "0.4.5"
4+
version = "0.4.6"
55

66
[deps]
77
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"

docs/src/api.md

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,5 @@ r2_score
5858

5959
```@docs
6060
PosteriorStats.kde_reflected
61-
PosteriorStats.pointwise_loglikelihoods
62-
PosteriorStats.pointwise_loglikelihoods(
63-
y::AbstractArray{<:Real,N},
64-
dists::AbstractArray{
65-
<:Distributions.Distribution{<:Distributions.ArrayLikeVariate{N}},M
66-
},
67-
) where {M,N}
61+
PosteriorStats.pointwise_conditional_loglikelihoods
6862
```

src/pointwise_loglikelihoods.jl

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,7 @@
1-
"""
2-
pointwise_loglikelihoods
3-
4-
Compute pointwise conditional log-likelihoods for ELPD-based model comparison/validation.
5-
6-
Given model parameters ``\\theta`` and observations ``y``, the pointwise conditional
7-
log-likelihood of ``y_i`` given ``y_{-i}`` (the elements of ``y`` excluding ``y_i``) and
8-
``\\theta`` is defined as
9-
```math
10-
\\log p(y_i \\mid y_{-i}, \\theta)
11-
```
12-
13-
This method is a utility function that dependant packages can override to provide pointwise
14-
conditional log-likelihoods for their own models/distributions.
15-
16-
See also: [`loo`](@ref)
17-
"""
18-
pointwise_loglikelihoods
1+
@deprecate pointwise_loglikelihoods(y, dists) pointwise_conditional_loglikelihoods(y, dists)
192

203
@doc """
21-
pointwise_loglikelihoods(y, dists)
4+
pointwise_conditional_loglikelihoods(y, dists)
225
236
Compute pointwise conditional log-likelihoods of `y` for non-factorized distributions.
247
@@ -52,7 +35,7 @@ PPL. This utility function computes ``\\log p(y_i \\mid y_{-i}, \\theta)`` terms
5235
- [LOOFactorized](@cite) Vehtari et al. Leave-one-out cross-validation for non-factorized
5336
models
5437
"""
55-
function pointwise_loglikelihoods(
38+
function pointwise_conditional_loglikelihoods(
5639
y::AbstractArray{<:Real,N},
5740
dists::AbstractArray{
5841
<:Distributions.Distribution{<:Distributions.ArrayLikeVariate{N}},M
@@ -62,13 +45,13 @@ function pointwise_loglikelihoods(
6245
sample_dims = ntuple(identity, M)
6346
log_like = similar(y, T, (axes(dists)..., axes(y)...))
6447
for (dist, ll) in zip(dists, eachslice(log_like; dims=sample_dims))
65-
pointwise_loglikelihoods!(ll, y, dist)
48+
pointwise_conditional_loglikelihoods!(ll, y, dist)
6649
end
6750
return log_like
6851
end
6952

7053
# Array-variate normal distribution
71-
function pointwise_loglikelihoods!(
54+
function pointwise_conditional_loglikelihoods!(
7255
log_like::AbstractVector{<:Real},
7356
y::AbstractVector{<:Real},
7457
dist::Distributions.MvNormal,
@@ -78,7 +61,7 @@ function pointwise_loglikelihoods!(
7861
g = Σ \ (y - μ)
7962
return @. log_like = (log(λ) - g^2 / λ - log2π) / 2
8063
end
81-
function pointwise_loglikelihoods!(
64+
function pointwise_conditional_loglikelihoods!(
8265
log_like::AbstractVector{<:Real},
8366
y::AbstractVector{<:Real},
8467
dist::Distributions.MvNormalCanon,
@@ -88,7 +71,7 @@ function pointwise_loglikelihoods!(
8871
cov_inv_y = _pdmul(J, y)
8972
return @. log_like = (log(λ) - (cov_inv_y - h)^2 / λ - log2π) / 2
9073
end
91-
function pointwise_loglikelihoods!(
74+
function pointwise_conditional_loglikelihoods!(
9275
log_like::AbstractMatrix{<:Real},
9376
y::AbstractMatrix{<:Real},
9477
dist::Distributions.MatrixNormal,
@@ -101,19 +84,19 @@ function pointwise_loglikelihoods!(
10184
end
10285

10386
# Multivariate log-normal distribution
104-
function pointwise_loglikelihoods!(
87+
function pointwise_conditional_loglikelihoods!(
10588
log_like::AbstractVector{<:Real},
10689
y::AbstractVector{<:Real},
10790
dist::Distributions.MvLogNormal,
10891
)
10992
logy = log.(y)
110-
pointwise_loglikelihoods!(log_like, logy, dist.normal)
93+
pointwise_conditional_loglikelihoods!(log_like, logy, dist.normal)
11194
log_like .-= logy
11295
return log_like
11396
end
11497

11598
# Array-variate t-distribution
116-
function pointwise_loglikelihoods!(
99+
function pointwise_conditional_loglikelihoods!(
117100
log_like::AbstractVector{T},
118101
y::AbstractVector{<:Real},
119102
dist::Distributions.GenericMvTDist,

test/pointwise_loglikelihoods.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,14 @@ end
155155

156156
test_factorized = !(dist_type <: Distributions.GenericMvTDist)
157157

158-
@testset "pointwise_loglikelihoods!" begin
158+
@testset "pointwise_conditional_loglikelihoods!" begin
159159
@testset "consistent with conditional distributions" begin
160160
dist = rand_dist(dist_type, T, sz)
161161
y = convert(Array{T}, rand(dist))
162162
@assert eltype(y) == T
163163
log_like = similar(y)
164164
y_inds = ndims(y) > 1 ? CartesianIndices(y) : eachindex(y)
165-
PosteriorStats.pointwise_loglikelihoods!(log_like, y, dist)
165+
PosteriorStats.pointwise_conditional_loglikelihoods!(log_like, y, dist)
166166
conditional_dists = conditional_distribution.(Ref(dist), Ref(y), y_inds)
167167
log_like_ref = loglikelihood.(conditional_dists, y)
168168
@test log_like log_like_ref
@@ -173,14 +173,14 @@ end
173173
y = convert(Array{T}, rand(dist))
174174
@assert eltype(y) == T
175175
log_like = similar(y)
176-
PosteriorStats.pointwise_loglikelihoods!(log_like, y, dist)
176+
PosteriorStats.pointwise_conditional_loglikelihoods!(log_like, y, dist)
177177
factorized_dists = factorized_distributions(dist)
178178
log_like_ref = loglikelihood.(factorized_dists, y)
179179
@test log_like log_like_ref
180180
end
181181
end
182182

183-
@testset "pointwise_loglikelihoods" begin
183+
@testset "pointwise_conditional_loglikelihoods" begin
184184
ndraws, nchains = 7, 3
185185
@testset for dim_type in (UnitRange, DimensionalData.Dim)
186186
if dim_type <: UnitRange
@@ -207,7 +207,9 @@ end
207207
@assert size(dists) == (ndraws, nchains)
208208
y = zeros(T, y_dims...)
209209
rand!(first(dists), y)
210-
log_like = @inferred PosteriorStats.pointwise_loglikelihoods(y, dists)
210+
log_like = @inferred PosteriorStats.pointwise_conditional_loglikelihoods(
211+
y, dists
212+
)
211213
@test size(log_like) == (ndraws, nchains, sz...)
212214
@test eltype(log_like) == T
213215
@test all(isfinite, log_like)

0 commit comments

Comments
 (0)