SITMUF#
Historical context#
The statistical properties of the MUF sequence has been studied extensively, and as early as the 1980s, it was noted that there was correlation between successive material balance periods. Pike and Woods were the first to develop a concept called ITMUF (Independent Transformed MUF) and later SITMUF (Standardized Independent MUF). The SITMUF sequence is a transformed material balance sequence wherein the mean is approximately zero and the standard deviation is approximately one. There are two key advantages to performing statistical testing on such an independent sequence:
Alarm thresholds for SITMUF depend only on the sequence length, not the form or properties of the MUF covariance
This alleviates the need to determine alarm thresholds by strictly using simulation
In a near-real time accountancy context, the variance of SITMUF decreases as the approximate covariance of the MUF sequence approaches the true value
Consequently, the detection probability of SITMUF increases over time, often resulting in a higher detection probability than the MUF sequence alone
The transformation from MUF to SITMUF was quite difficult until Picard showed that the SITMUF transform can be easily expressed using the Cholesky decomposition. A series of papers in the late 1980s onward showed that applying Page’s trend test to SITMUF performs well for a wide range of potential material loss scenarios when the pattern is not known. Page’s trend test on SITMUF has been frequently used as an effective test in nuclear material accountancy.
Theory#
Recall that the muf sequence is defined as follows:
With
It’s generally assumed that since the error models are normally distributed, individual muf values (i.e., mbp
The covariance matrix contains the covariance between different material balances in the sequence. For example, consider the entry
Note
The covariance matrix
The SITMUF statistic is muf with a mean of zero and standard deviation of one. This can be initially considered through the subtraction of the sequence mean and division by the sequence standard deviation. The independent material balance sequence can be expressed by estimating the sequence mean through the conditional expectation given all previously observed muf values:
Then note that SITMUF is ITMUF divided by the standard deviation:
The using the expression for conditional expectation of the multivariate normal distribution with the covariance expression (1) from the expression then becomes:
Picard showed a convenient way to calculating the above expression is through the use of the Cholesky decomposition. Since Picard fully derives the relationship between the expression above and the Cholesky decomposition, we refrain from showing that work here. The final expression for SITMUF becomes
Where
Calculation of the covariance matrix#
The covariance matrix is calculated using the AuxFunctions.calcCovMat()
function. Setting up and calculating the covariance matrix is the most tedious and involved part of the SITMUF transform and is handled by it’s own function. More details regarding the covariance matrix can be found here.
Discussion#
It’s important to note that the variance of SITMUF decreases with time as the estimated covariance matrix approaches the true value. The SITMUF transform is a ‘‘forward-only’’ method in that the transformed MUF values only benefit from the current covariance matrix entries. So, for example, even if you have an entire MUF sequence, the first MUF (MUF
Implementation#
The SITMUF implementation in MAPIT isn’t very expensive thanks to optimized linear algebra libraries used to perform the Cholesky decomposition and other associated matrix operations. The SITMUF function only computes this quantity:
Each SITMUF realization (that is, each iteration) is calculated separately as the Cholesky decomposition from Numpy isn’t vectorized (it’s pretty quick on modern machines, anyways). We start by converting the MUF values from a continuous vector in time to a discrete vector on a per balance basis:
StatsTests.py
686 for ZR in range(0,P):
687 tempID[ZR] = MUF[k,ZR*MBP]
After that, we attempt to perform the Cholesky decomposition. The decomposition will fail if the covariance matrix wasn’t constructed properly, so we try to pass a warning/error if this happens.
StatsTests.py
691 try:
692 V = np.linalg.cholesky(tempcovmatrix)
If the decomposition succeeds, then we proceed directly to the transform itself:
StatsTests.py
707 SITMUF = np.matmul(np.linalg.inv(V),tempID)
Important
MAPIT’s implementation calculates the entire SITMUF sequence in one pass resulting in the full length sequence. In practice, a more near-real time approach is adopted wherein, at each balance period, new values are appended to the covariance matrix and the MUF sequence is extended. Then the calculation is performed on the new sequence and the last value of the resulting SITMUF sequence is the current SITMUF value that is recorded for regulatory purposes. There’s no benefit for us to perform the calculation this way as the values are the same if you iteratively calculate SITMUF (with a increasingly large covariance matrix) or do it at once as we do.
We then convert the discrete SITMUF sequence to a continuous representation before continuing through all iterations. Then the final matrix is returned.