What an FCS Update Schedule Specifies
A fully conditional specification (FCS) run repeatedly updates the missing values of one variable at a time. An update schedule records which incomplete variable is updated at each step, which other variables predict it, and which current values of those predictors are used. It also states when the chain’s completed data are saved. These details make an algorithm reproducible: saying only “we used chained equations” does not specify the sequence of computations.
The schedule does not, by itself, determine whether each conditional model is appropriate or whether the resulting conditionals correspond to one joint distribution. Those are separate questions. Here the goal is to specify the computation correctly and make its state transitions auditable.
For a schedule to be well-defined, it must identify the target variables, their order, and each target’s predictor set. A fully observed variable may be a predictor but is not an incomplete target. A variable omitted from a target’s predictor set is not used in that update, even if its values are available. In ordinary single-target FCS, each incomplete target occurs once per sweep.
Writing the Within-Sweep Conditioning Sets
Suppose the incomplete targets are \(Y_1,\ldots,Y_p\), and choose a fixed order represented by the permutation \(\pi=(\pi_1,\ldots,\pi_p)\). Let \(Y_j^{(t-1)}\) be the completed values at the end of sweep \(t-1\). During sweep \(t\), write \(Y_j^{(t,k)}\) for the values after step \(k\) has been completed. Thus, at the start of sweep \(t\), \(Y_j^{(t,0)}=Y_j^{(t-1)}\) for every target. At step \(k\), target \(Y_{\pi_k}\) is updated; earlier targets in the order already have their sweep-\(t\) values, while later targets still have their sweep-\((t-1)\) values.
Let \(\mathcal{C}_{\pi_k}\) be the chosen predictor set for target \(Y_{\pi_k}\), drawn from other incomplete variables and fully observed predictors. The correct conditioning set uses the version of each predictor according to its position in the schedule:
Here \(f_{\pi_k}\) denotes the specified conditional imputation model; \(Y_{\pi_k,\mathrm{obs}}\) denotes the target’s observed values used in fitting or otherwise informing that model, and \(X_{\mathcal{C}_{\pi_k}}\) denotes the fully observed predictors included in its predictor set. The sets in the display are restricted to predictors actually included in \(\mathcal{C}_{\pi_k}\). The target’s observed values are not overwritten. After all \(p\) updates, define \(Y_j^{(t)}=Y_j^{(t,p)}\).
This indexing is particularly useful when the order is not the numerical order of the variable labels. For example, if \(\pi=(2,3,1)\), then at the first step both later targets are still at their previous-sweep values: \(Y_3^{(t-1)}\) and \(Y_1^{(t-1)}\). The schedule position, not the target’s variable number, determines whether its value is current or previous.
Worked Example: A Three-Target Sweep
Worked Example: A Three-Target Sweep
Consider four hypothetical records with fully observed \(X\) and incomplete variables \(A,B,C\). The observed entries are shown below; “missing” marks entries to be imputed.
| Record | \(X\) | \(A\) | \(B\) | \(C\) |
|---|---|---|---|---|
| 1 | 0 | 2 | missing | 7 |
| 2 | 1 | missing | 5 | missing |
| 3 | 0 | 4 | 6 | 8 |
| 4 | 1 | missing | missing | 9 |
Use the fixed order \(A,C,B\), and include both other incomplete variables and \(X\) in each target’s predictor set. Suppose the completed state at the start of sweep \(t\) has \(A_2=3.0,\ A_4=5.0,\ B_1=4.0,\ B_4=7.0,\ C_2=6.0\). These are hypothetical starting imputations, not observed data.
Step 1: Update \(A\). The conditioning predictors are \(B,C,X\). Since \(C\) and \(B\) have not yet been updated in this sweep, use their sweep-\((t-1)\) values, along with fixed \(X\). Draw new values for \(A_2\) and \(A_4\), leaving \(A_1=2\) and \(A_3=4\) unchanged. For illustration, suppose the conditional draws are \(A_2=3.2\) and \(A_4=4.8\).
Step 2: Update \(C\). The predictors are \(A,B,X\). \(A\) has already been updated, so use its sweep-\(t\) values, including \(A_2=3.2\) and \(A_4=4.8\). \(B\) has not been updated, so use its sweep-\((t-1)\) values. Draw the missing \(C_2\); suppose the draw is \(C_2=6.4\). The observed values \(C_1=7,C_3=8,C_4=9\) remain fixed.
Step 3: Update \(B\). The predictors are \(A,C,X\), both incomplete predictors already updated in this sweep. Use their sweep-\(t\) values, including \(A_2=3.2,\ A_4=4.8,\ C_2=6.4\). Draw \(B_1\) and \(B_4\); suppose the draws are \(B_1=4.5\) and \(B_4=6.8\). The observed \(B_2=5\) and \(B_3=6\) remain fixed.
At the end of the sweep the saved completed state, if this sweep is selected for saving, contains all those new values together. In particular, it contains \(A_2=3.2,\ C_2=6.4,\ B_1=4.5,\ B_4=6.8\), not a mixture in which some targets have been taken from before the sweep. The numerical draws here illustrate bookkeeping; their values would in an actual run be generated by the specified conditional models.
Justification: Why the Schedule Uses Mixed Iteration Indices
The indexing follows directly from the sequential algorithm. At the start of sweep \(t\), no target has yet been updated, so every incomplete predictor has its value from \(t-1\). After step 1, the first target has a new value; after step 2, the first two targets have new values, and so on. Therefore, immediately before step \(k\), a predictor \(Y_{\pi_r}\) with \(r<k\) has been updated and must use its current value. A predictor with \(r>k\) has not been updated and must use the previous completed state. This accounts for every scheduled predictor without assuming that the numerical index of a variable matches its position in the order.
The target itself is not included as its own predictor. After its missing entries are drawn, its observed entries are retained, so the update changes only the missing part of that target. Applying this rule at every step yields a complete sweep: every target is updated once, and every predictor value is traceable to either an earlier update in the same sweep or the completed state at its start.
Worked Example: A Non-Numerical Update Order
Worked Example: A Non-Numerical Update Order
Suppose a hypothetical dataset has incomplete targets \(Y_1,Y_2,Y_3\), a fully observed covariate \(X\), and the fixed order \((Y_2,Y_3,Y_1)\). For simplicity, each target uses both other incomplete variables and \(X\).
At step 1, update \(Y_2\). Its incomplete predictors \(Y_3\) and \(Y_1\) have not yet been updated, so use \(Y_3^{(t-1)}\) and \(Y_1^{(t-1)}\), plus fixed \(X\).
At step 2, update \(Y_3\). The predictor \(Y_2\) is already updated, so use \(Y_2^{(t,1)}\). The predictor \(Y_1\) is not yet updated, so use \(Y_1^{(t-1)}\), plus \(X\).
At step 3, update \(Y_1\). Both \(Y_2\) and \(Y_3\) have been updated, so use their sweep-\(t\) values, \(Y_2^{(t,2)}\) and \(Y_3^{(t,2)}\), plus \(X\). The notation depends on schedule position: at step 1, the later targets are \(Y_3\) and \(Y_1\), not variables obtained by adding one to the target’s numerical subscript.
Choosing and Recording the Schedule
A practical schedule should be explicit enough that another analyst could reproduce its update sequence. For each target, record its position in the sweep, predictor set, and the rule for handling observed target values and fixed covariates. The order is generally a design choice rather than a claim that one permutation is universally best. Earlier material on sensitivity to variable ordering and randomized ordering motivates treating the chosen order as something to document and, when appropriate, examine for robustness.
Include each variable with missing entries that will be imputed. Separate fully observed predictors, which are not targets.
For every target, name the predictors included in its conditional model. Check that each incomplete predictor has an available value at the time it is used.
Write the targets as an ordered list. In a fixed-order run, repeat that list on every sweep; if order is randomized, state how the order is generated and recorded.
State the burn-in and which completed sweep numbers will be retained. Save only after every target in the sweep has been updated.
Here is a compact record for the first worked example:
| Step | Target | Incomplete predictors | Values used |
|---|---|---|---|
| 1 | \(A\) | \(B,C\) | Both from sweep \(t-1\) |
| 2 | \(C\) | \(A,B\) | \(A\) from sweep \(t\); \(B\) from sweep \(t-1\) |
| 3 | \(B\) | \(A,C\) | Both from sweep \(t\) |
Worked Example: Defining Which Sweeps to Save
Worked Example: Defining Which Sweeps to Save
Suppose a run uses the fixed three-target order \(A,C,B\). After deciding on a burn-in of 20 complete sweeps, an analyst plans to retain every fifth sweep thereafter, with the first retained sweep numbered 25. The retained sweep numbers are \(25,30,35,40\) if the run continues through sweep 40. The arithmetic is \(25+5q\) for \(q=0,1,2,3\), giving \(25,30,35,40\).
For each retained number, save the full completed dataset after the third update of that sweep. Do not label the state after updating \(A\) as sweep 25, for example: it is only an intermediate state in that sweep. If there are multiple independent chains, apply and record the schedule separately for each chain; a saved state must retain its chain identity as well as its sweep number.
Diagnostics, Alternatives, and Limitations
Schedule auditing begins with bookkeeping. For a small test run, write down the order and check each update against the state used for every predictor. Confirm that every intended incomplete target appears exactly once per sweep, observed entries never change, fully observed predictors remain fixed, and saved records are end-of-sweep states. A trace indexed by update number rather than sweep number can help reveal accidental omissions or duplicated target updates.
- Stale-value error: using the previous-sweep value for a target that has already been updated ignores the specified sequential schedule. Conversely, using a current-sweep value for a target not yet updated uses a value that does not yet exist in that sweep.
- Wrong target order: confusing a variable’s label with its position in the permutation can assign incorrect conditioning values, especially for a non-numerical order.
- Partial saving: retaining a state after only some targets have been updated produces an inconsistent record of a full sweep.
- Unintended predictor set: an available variable is not automatically a predictor. Compare the implemented model matrix or model specification with the recorded set for each target.
A fixed systematic order is straightforward to implement and audit. A randomized order changes the permutation across sweeps and can be used as an ordering robustness check, but its randomization rule and realized order should be recorded. Updating all targets from only the previous sweep’s values is a different, simultaneous-style scheme; it is not the sequential sweep described here. Neither a careful schedule nor a particular ordering guarantees good mixing, valid conditional models, or a compatible joint distribution. These are limitations of what schedule design alone can establish; the chain still requires appropriate model choices and diagnostics.
Check Your Understanding
Answer each question using the schedule rules above. Brief solutions follow.
- For order \((Y_3,Y_1,Y_2)\), at the second update, which sweep’s values are used for predictors \(Y_3\) and \(Y_2\)?
- There are incomplete targets \(A,B,C\), ordered \(B,A,C\). Target \(A\) uses \(B,C,X\) as predictors, where \(X\) is fully observed. Which versions of its incomplete predictors are used?
- In one sweep, an analyst saves the completed data immediately after updating the first of four targets. Is that a saved iteration under the definition in this tutorial? Explain.
- A schedule includes incomplete \(A,B,C\), but target \(B\)'s specified predictor set contains only \(A\) and fully observed \(X\). Should \(C\) be included in the conditioning set merely because it has been imputed? Explain.
- State two checks that can detect an implementation error in an FCS schedule.
Solutions. (1) \(Y_3\) has already been updated, so use its sweep-\(t\) value; \(Y_2\) has not, so use its sweep-\((t-1)\) value. (2) \(B\) is earlier than \(A\), so use \(B^{(t)}\); \(C\) is later, so use \(C^{(t-1)}\); \(X\) stays fixed at its observed values. (3) No. A saved iteration is the state after all four targets have been updated once. (4) No. \(C\) is not in \(B\)'s specified predictor set, so it is not a conditioning predictor in that update. (5) Examples include verifying that each target is updated exactly once per sweep, checking that observed entries remain unchanged, and confirming that saved states are taken only at sweep boundaries.