Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 6 additions & 34 deletions src/data/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ impl SubjectBuilder {
/// Prefer stable route names such as `"depot"` or `"iv"` when the model
/// declares named routes.
pub fn bolus(self, time: f64, amount: f64, input: impl ToString) -> Self {
let bolus = Bolus::new(time, amount, input, self.current_occasion.index());
let bolus = Bolus::new(time, amount, input);
let event = Event::Bolus(bolus);
self.event(event)
}
Expand All @@ -125,7 +125,7 @@ impl SubjectBuilder {
/// * `input` - Public input label receiving the dose
/// * `duration` - Duration of the infusion in time units
pub fn infusion(self, time: f64, amount: f64, input: impl ToString, duration: f64) -> Self {
let infusion = Infusion::new(time, amount, input, duration, self.current_occasion.index());
let infusion = Infusion::new(time, amount, input, duration);
let event = Event::Infusion(infusion);
self.event(event)
}
Expand All @@ -138,14 +138,7 @@ impl SubjectBuilder {
/// * `value` - Observed value (e.g., drug concentration)
/// * `outeq` - Public output label for this observation
pub fn observation(self, time: f64, value: f64, outeq: impl ToString) -> Self {
let observation = Observation::new(
time,
Some(value),
outeq,
None,
self.current_occasion.index(),
Censor::None,
);
let observation = Observation::new(time, Some(value), outeq, None, Censor::None);
let event = Event::Observation(observation);
self.event(event)
}
Expand All @@ -165,14 +158,7 @@ impl SubjectBuilder {
outeq: impl ToString,
censoring: Censor,
) -> Self {
let observation = Observation::new(
time,
Some(value),
outeq,
None,
self.current_occasion.index(),
censoring,
);
let observation = Observation::new(time, Some(value), outeq, None, censoring);
let event = Event::Observation(observation);
self.event(event)
}
Expand All @@ -187,14 +173,7 @@ impl SubjectBuilder {
/// Use this when you want a prediction at a time point but do not have an
/// observed value.
pub fn missing_observation(self, time: f64, outeq: impl ToString) -> Self {
let observation = Observation::new(
time,
None,
outeq,
None,
self.current_occasion.index(),
Censor::None,
);
let observation = Observation::new(time, None, outeq, None, Censor::None);
let event = Event::Observation(observation);
self.event(event)
}
Expand All @@ -216,14 +195,7 @@ impl SubjectBuilder {
errorpoly: ErrorPoly,
censored: Censor,
) -> Self {
let observation = Observation::new(
time,
Some(value),
outeq,
Some(errorpoly),
self.current_occasion.index(),
censored,
);
let observation = Observation::new(time, Some(value), outeq, Some(errorpoly), censored);
let event = Event::Observation(observation);
self.event(event)
}
Expand Down
20 changes: 10 additions & 10 deletions src/data/error_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1184,15 +1184,15 @@ mod tests {

#[test]
fn test_additive_error_model() {
let observation = Observation::new(0.0, Some(20.0), 0, None, 0, Censor::None);
let observation = Observation::new(0.0, Some(20.0), 0, None, Censor::None);
let prediction = observation.to_prediction(10.0, vec![]);
let model = AssayErrorModel::additive(ErrorPoly::new(1.0, 0.0, 0.0, 0.0), 5.0);
assert_eq!(model.sigma(&prediction).unwrap(), (26.0_f64).sqrt());
}

#[test]
fn test_proportional_error_model() {
let observation = Observation::new(0.0, Some(20.0), 0, None, 0, Censor::None);
let observation = Observation::new(0.0, Some(20.0), 0, None, Censor::None);
let prediction = observation.to_prediction(10.0, vec![]);
let model = AssayErrorModel::proportional(ErrorPoly::new(1.0, 0.0, 0.0, 0.0), 2.0);
assert_eq!(model.sigma(&prediction).unwrap(), 2.0);
Expand Down Expand Up @@ -1353,7 +1353,7 @@ mod tests {
.add("cp", model)
.unwrap();

let observation = Observation::new(0.0, Some(20.0), 0, None, 0, Censor::None);
let observation = Observation::new(0.0, Some(20.0), 0, None, Censor::None);
let prediction = observation.to_prediction(10.0, vec![]);

assert_eq!(models.sigma(&prediction).unwrap(), (26.0_f64).sqrt());
Expand Down Expand Up @@ -1479,7 +1479,7 @@ mod tests {
let model = AssayErrorModel::additive(ErrorPoly::new(1.0, 0.0, 0.0, 0.0), 5.0);
let models = AssayErrorModels::empty().add(0, model).unwrap();

let observation = Observation::new(0.0, Some(20.0), 0, None, 0, Censor::None);
let observation = Observation::new(0.0, Some(20.0), 0, None, Censor::None);
let prediction = observation.to_prediction(10.0, vec![]);

// Non-parametric: sigma from observation
Expand All @@ -1492,7 +1492,7 @@ mod tests {
let model = AssayErrorModel::additive(ErrorPoly::new(1.0, 0.0, 0.0, 0.0), 5.0);
let models = AssayErrorModels::empty().add(0, model).unwrap();

let observation = Observation::new(0.0, Some(20.0), 1, None, 0, Censor::None); // outeq=1 not in models
let observation = Observation::new(0.0, Some(20.0), 1, None, Censor::None); // outeq=1 not in models
let prediction = observation.to_prediction(10.0, vec![]);

let result = models.sigma(&prediction);
Expand All @@ -1508,7 +1508,7 @@ mod tests {
let model = AssayErrorModel::additive(ErrorPoly::new(1.0, 0.0, 0.0, 0.0), 5.0);
let models = AssayErrorModels::empty().add(0, model).unwrap();

let observation = Observation::new(0.0, Some(20.0), 0, None, 0, Censor::None);
let observation = Observation::new(0.0, Some(20.0), 0, None, Censor::None);
let prediction = observation.to_prediction(10.0, vec![]);

let variance = models.variance(&prediction).unwrap();
Expand All @@ -1521,7 +1521,7 @@ mod tests {
let model = AssayErrorModel::additive(ErrorPoly::new(1.0, 0.0, 0.0, 0.0), 5.0);
let models = AssayErrorModels::empty().add(0, model).unwrap();

let observation = Observation::new(0.0, Some(20.0), 1, None, 0, Censor::None); // outeq=1 not in models
let observation = Observation::new(0.0, Some(20.0), 1, None, Censor::None); // outeq=1 not in models
let prediction = observation.to_prediction(10.0, vec![]);

let result = models.variance(&prediction);
Expand Down Expand Up @@ -1662,13 +1662,13 @@ mod tests {
.unwrap();

// Test with outeq=0 (additive model)
let obs1 = Observation::new(0.0, Some(20.0), 0, None, 0, Censor::None);
let obs1 = Observation::new(0.0, Some(20.0), 0, None, Censor::None);
let pred1 = obs1.to_prediction(10.0, vec![]);
let sigma1 = models.sigma(&pred1).unwrap();
assert_eq!(sigma1, (26.0_f64).sqrt()); // additive: sqrt(alpha^2 + lambda^2) = sqrt(1^2 + 5^2) = sqrt(26)

// Test with outeq=1 (proportional model)
let obs2 = Observation::new(0.0, Some(20.0), 1, None, 0, Censor::None);
let obs2 = Observation::new(0.0, Some(20.0), 1, None, Censor::None);
let pred2 = obs2.to_prediction(10.0, vec![]);
let sigma2 = models.sigma(&pred2).unwrap();
assert_eq!(sigma2, 2.0); // proportional: gamma * alpha = 2 * 1 = 2
Expand Down Expand Up @@ -1810,7 +1810,7 @@ mod tests {
#[test]
fn test_fixed_parameters_in_calculations() {
// Test that fixed and variable parameters produce the same calculation results
let observation = Observation::new(0.0, Some(20.0), 0, None, 0, Censor::None);
let observation = Observation::new(0.0, Some(20.0), 0, None, Censor::None);
let prediction = observation.to_prediction(10.0, vec![]);

let model_variable = AssayErrorModel::additive(ErrorPoly::new(1.0, 0.0, 0.0, 0.0), 5.0);
Expand Down
Loading
Loading