fips.Posterior.dofs_per_element#

property Posterior.dofs_per_element: Vector[source]#

the diagonal of averaging_kernel(), on the prior’s space.

\(A_{jj}\), how much the estimate of element \(j\) responds to its own true value: near 1 for an element the observations constrain, near 0 for one left at its prior. The values sum to dofs, so a group’s share (a region, a block, a month) is a sum over its labels. The analytic method computes the diagonal from its factors, without forming the gain or the n x n kernel.

A diagonal entry is not the information on that element alone: the rest of its row of \(A\) says how much of the estimate comes from the true values of the other elements.

See also

dofs

Their sum.

averaging_kernel

The full kernel \(A = K H\).

information_content

The information the observations give, in nats.

Examples

>>> import numpy as np
>>> import pandas as pd
>>> import fips
>>> cells = pd.Index(["a", "b"], name="cell")
>>> obs_id = pd.Index(["o1", "o2", "o3"], name="obs_id")
>>> prior = fips.Vector.from_series(pd.Series(0.0, index=cells), block="flux")
>>> obs = fips.Vector.from_series(
...     pd.Series([1.0, 2.0, 3.0], index=obs_id), block="co2"
... )
>>> problem = fips.Problem(
...     prior=prior,
...     prior_cov=fips.Independent().with_std(1.0),
...     obs=obs,
...     obs_cov=fips.Independent().with_std(np.sqrt(0.1)),
...     forward=fips.Operator(
...         np.array([[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]),
...         obs.space,
...         prior.space,
...     ),
... )
>>> post = fips.solve(problem)
>>> post.dofs_per_element.to_series().round(3)
block  cell
flux   a       0.938
       b       0.938
Name: dofs_per_element, dtype: float64
>>> round(post.dofs, 3)
1.877
Type:

Each state element’s share of dofs