Tutorials › Multiple Imputation by Chained Equations (MICE) › Logging MICE Workflows for Auditing

Software, Reporting and Pitfalls · Tutorial 482 of 497

Logging MICE Workflows for Auditing

Build an auditable MICE log that records what happened during a run while keeping confidential data and unsafe diagnostic details out of the log.

Intermediate 11 min read

What You'll Learn

  • Specify a structured log entry and a lifecycle for each MICE run.
  • Choose timestamps and run identifiers that support reliable event ordering.
  • Record input-file and configuration information without logging private records or unsafe paths.
  • Capture warnings, errors, and completion status in a consistent, reviewable form.
  • Recognize logging failures, privacy risks, and the limits of a log as audit evidence.

Why Log a MICE Run?

A MICE workflow may read several input files, apply preprocessing, initialize and run chained equations, and stop either normally or because of an error. A useful log lets a reviewer determine which run an event belongs to, when it happened, what safe configuration and input references were used, which warnings or errors occurred, and whether the run completed. Without those facts, a saved result or a console transcript may be difficult to interpret after the session ends.

A log is an operational record of events, not a copy of the analysis data and not proof that the imputation model was appropriate. The aim is to record enough to reconstruct the sequence and status of a run while avoiding record-level information. Keep detailed scientific reporting and dataset provenance as separate concerns.

Definition: A MICE run log is a timestamped, structured record of selected workflow events linked by a unique run identifier. Each event records only the operational information needed for audit, such as event type, safe input references, approved configuration fields, warnings or errors, and status. It must not contain confidential records or unnecessary sensitive identifiers.

Designing a Safe, Useful Log

Before logging begins, decide what the log is allowed to contain and who may read it. Use a documented allowlist of fields rather than recording every variable available in the software environment. A practical event may contain the run identifier, event name, UTC timestamp, software step, input-file alias or approved fingerprint, selected configuration values, a warning or error category, and a status. Include a schema version so that a later reader can interpret the fields.

Use a unique, opaque run identifier, such as a randomly generated UUID. Do not build identifiers from patient IDs, initials, dates of birth, clinic names, or other identifying details. Record timestamps in a consistent timezone, preferably UTC in an unambiguous format such as 2026-10-24T14:03:12Z. Wall-clock timestamps support review across systems; a monotonic timer is preferable for elapsed duration because system clocks can be adjusted during a run.

Input and configuration records need care. A path can reveal a person's name, a clinic, or a restricted project location. Prefer a controlled alias such as “analysis_input_1” and, where appropriate, a cryptographic digest of the file contents. A digest helps distinguish file versions but is not automatically safe: for a small or predictable file, someone could guess candidate contents and compare hashes. Protect the log and any mapping from aliases to restricted paths according to the data-access policy.

For configuration, record only approved settings needed to identify the run’s operating choices, such as the number of imputations, iteration count, and selected method labels. Do not dump an entire configuration object by default: it may contain passwords, tokens, local paths, free-text notes, or data values. A configuration fingerprint can flag that two configurations differ, but it does not explain the difference; retain the controlled configuration separately if review requires it.

Key rule: Log the workflow’s operational facts, not rows from the analytic data. Avoid logging model matrices, completed records, residuals or predictions tied to individuals, and unfiltered error messages that may include values or paths.

Lifecycle, Timestamps, and Status

A run should have a clear lifecycle. At minimum, emit a start event and exactly one terminal event when the process can do so. Intermediate events can record input validation, MICE execution, and other relevant steps. Define terminal statuses in advance, for example “succeeded,” “failed,” and “interrupted.” A warning is an event, not necessarily a failure: the workflow may complete while issuing a warning that needs review.

A terminal status should reflect the workflow’s actual outcome. “Succeeded” means the required steps completed and their defined checks passed; it does not mean the imputation is statistically valid. “Failed” means a required step or check failed. “Interrupted” is appropriate when execution stopped without a normal terminal event and an external process can establish that fact. If the process is killed before it can write a final event, the log should remain visibly incomplete rather than being retrospectively labeled as a successful run.

$$ \text{elapsed time} = t_{\text{finish, monotonic}}-t_{\text{start, monotonic}} $$

The subtraction uses elapsed-time readings from the same monotonic clock, not a difference between potentially adjusted wall-clock timestamps. Store the wall-clock timestamps for event ordering and cross-system context, and store elapsed time when it is useful for reviewing the run.

1
Open a run.
Create an opaque run identifier and write a start event with a UTC timestamp and the log-schema version.
2
Record safe setup facts.
Record approved input aliases or fingerprints and whitelisted configuration fields. Validate that the proposed log fields contain no prohibited values.
3
Capture events.
Write relevant step events and sanitized warning or error categories as they occur, associating each with the run identifier.
4
Close with an honest status.
Write one terminal event when possible. If no terminal event exists, preserve that absence as evidence of an incomplete or uncertain run.

Worked Examples

Worked Example: Recording a Run Without Exposing Its Input

Suppose a hypothetical workflow reads one restricted file and is configured for 5 imputations and 20 iterations. The file is held in a protected location. The log policy permits an alias, a SHA-256 digest, and the two numeric settings, but forbids file paths, participant counts, and record values.

The logger assigns the run identifier “8f2c…91a7” (the shortened form is shown here for readability) and records the following safe setup summary: input alias “analysis_input_1,” approved digest “a4d1…7bc2,” imputations 5, iterations 20. It does not record the protected path or any participant-level information.

The digest is calculated from the file bytes using the approved hashing procedure; it is not a substitute for access control. If the input might be guessable, omit the digest or use a policy-approved keyed fingerprint. The reviewer can use the alias and protected mapping to locate the file through authorized means, while the ordinary log avoids disclosing its location.

Worked Example: Separating a Warning From Run Failure

A hypothetical run starts at 09:00 UTC, logs a warning at 09:04 UTC that one iteration produced a convergence diagnostic requiring review, and completes the required workflow checks at 09:11 UTC. The warning is recorded with its category, step, and time; the log does not include record-level diagnostic output.

Because the workflow’s predefined rule says this warning requires review but does not stop execution, the terminal status is “succeeded_with_warning” (or the equivalent status defined by the project). It would be incorrect to label the run “failed” merely because any warning occurred, and equally incorrect to omit the warning and report an unqualified success. The log communicates execution status; a reviewer still needs to assess the diagnostic itself using protected, appropriate materials.

Worked Example: Checking Elapsed Time and an Incomplete Run

A hypothetical process records a monotonic start reading of 18,420.5 seconds and a finish reading of 18,847.0 seconds. Its elapsed time is

$$ 18{,}847.0-18{,}420.5=426.5\text{ seconds} $$

Thus, the recorded duration is 426.5 seconds, or 7 minutes and 6.5 seconds. The UTC start and finish timestamps should also be retained as separate event times. If the process is forcibly terminated after the start event and before a terminal event, the log contains no evidence of successful completion. A monitoring process may later add an “interrupted” event if it can establish that the run stopped; otherwise, the status should remain unknown or incomplete, not be inferred as success.

Why the Lifecycle Logic Matters

Status is reliable only if it follows a defined rule. Consider a run as a sequence of events beginning with “started.” A normal terminal event is emitted only after the workflow’s required steps and checks have finished. Therefore, a terminal success event implies that those steps were reached, while the absence of such an event cannot establish that they were reached. This implication is one-way: a success label documents the workflow’s stated checks, not the statistical adequacy of the MICE model or the correctness of every input.

The distinction prevents a common audit error: treating the existence of a log file as evidence of completion. A log may have been created successfully and then stop halfway through. Review should check for a matching start and terminal event, consistent run identifiers, valid event ordering, and any required warnings or error events.

Warnings, Errors, and Failure Modes

Capture warnings and errors in a form that is useful but safe. A compact record can include the event time, run identifier, workflow step, predefined category, and a sanitized message. Avoid automatically storing full stack traces: they may expose file paths, parameter values, or fragments of data. If detailed debugging information is necessary, keep it in a restricted channel with an explicit retention and access policy. Never silently suppress a warning just to produce a clean-looking log.

Logging itself can fail because of permissions, disk exhaustion, a network outage, or malformed log output. Decide in advance what the workflow should do. For a required audit trail, a failure to write a critical event may need to stop the run before sensitive processing continues. If a noncritical event cannot be written, record the failure through an available protected mechanism and do not claim that the audit record is complete. The chosen policy should be consistent and testable.

Use structured records with stable field names and escaping rules. Plain, unstructured console output is harder to search and can mix unrelated runs; it also tends to encourage accidental printing of data. A structured append-only file or a controlled logging service makes event filtering and review easier, but introduces its own access-control, backup, and availability requirements. Neither format replaces secure storage and retention controls.

ApproachStrengthLimitation
Console output onlyEasy to inspect during an interactive runMay be lost, interleaved, or mixed with sensitive debugging output
Structured run logSupports consistent filtering by run, time, event, and statusRequires a schema, privacy review, protected storage, and failure handling
Detailed debug traceCan help diagnose software faultsMay expose more information than an audit log should contain; restrict and sanitize it

Common Mistakes and Practical Checks

  • Logging the whole environment. The wrong reasoning is that more information always improves reproducibility. In practice, broad dumps may expose data, secrets, or paths. Use a reviewed allowlist.
  • Using local timestamps without a timezone. “09:00” is ambiguous across systems and daylight-saving changes. Record an explicit UTC timestamp.
  • Calling a run successful because a results file exists. A file may be partial or stale. Require a matching run identifier and a valid terminal event under the defined status rules.
  • Putting sensitive details in error text. An exception message can include values or paths. Sanitize and categorize errors before writing them.
  • Treating a hash as guaranteed anonymization. Hashes can be compared with candidate files or may enable guessing in some settings. Assess whether the fingerprint is appropriate and protect the log.

A useful review asks whether every event has a valid run identifier and timestamp, whether fields match the approved schema, whether the input references and settings are sufficient for the intended operational audit, whether warnings and errors are represented, and whether completion is explicit rather than assumed. Also verify that a test log contains no prohibited records, paths, or credentials.

Key takeaway: A good MICE log is selective, timestamped, linked to a unique run, explicit about warnings and terminal status, and designed to exclude sensitive records. It documents what the workflow reports doing; it does not by itself validate the analysis or guarantee that every event was captured.

Check Your Understanding

Answer each question, then compare your reasoning with the solutions.

  1. Why should a run identifier be opaque rather than constructed from a participant or clinic identifier?
  2. A log contains a start event and several step events but no finish event. Can it be called successful? Explain.
  3. A warning occurs, but the workflow completes all required steps and checks. What should the log do?
  4. Why might a file digest still require privacy review?

Solutions. (1) An opaque identifier links events without disclosing identifying information; identifiers derived from participants or clinics can expose sensitive details. (2) No. The missing terminal event means completion is not established, so the run must remain incomplete or uncertain unless a reliable monitoring event records interruption. (3) Record the warning with a safe category and context, then use the predefined terminal status that represents completed execution with a warning. Do not suppress the warning or automatically label the run failed unless policy says it blocks completion. (4) A digest can be matched against candidate files, especially when the contents are predictable; it is a fingerprint, not guaranteed anonymization, so its use and storage need review.

Clinical Biostats