SciML / SciML/StructuralIdentifiability.jl

Rationalizing input model

Open
#144 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
Julia
Stars
129
Forks
23
Avg merge
9h 35m
Merged PRs (30d)
17

Description

At the moment all the algorithms in the package require input models to have rational right-hand side (that is, the rhs must be a quotient of two polynomials). One way to lift this limitation is to transform the system into a rational or even polynomial one. It is know that this can be done by introducing new variables (detailed algorithm with implementation in Python).

However, there is an important subtlety. Consider an example:

x'(t) = a * e^x(t)
y(t) = x(t)

The standard idea would be to introduce a new variable z(t) := e^x(t), this will recast the system into

x'(t) = a * z(t)
z'(t) = a * z(t)^2
y(t) = x(t)

In the latter model, parameter a will be non identifiable. However, if we add a different new variable w'(t) := a * e^x(t), the system will become

x'(t) = w(t)
w'(t) = w(t)^2
y(t) = x(t)

Although a has disappeared from the system, knowing x(0) and w(0) is sufficient to find it. Since these initial conditions are identifiable (and they are), a is in fact identifiable as well.

The difference between the two transformations above is that the former increases the number of degrees of freedom in the system and the latter does not. Because of this, the former yield an incorrect result. Therefore, the overall goal would be to have a procedure for transforming the model into a rational one while keeping the number of degrees of freedom the same. For practical examples of "careful" transformation, see sections A.2 and A.3 in this paper.

One plausible approach is:

  1. Implement any reasonable procedure for transforming a system into a rational one (e.g. adding all non rational terms as new variables until we are done). This may increase the number of degrees of freedom.
  2. Reduce back the number of degrees of freedom by applying an algorithm for finding scaling transformation from this paper.

This approach will work nicely for the example above. Implementing any of the two steps above separately would be a nice and welcome contribution on its own.

UPD: A simpler procedure can be established for parameters only #190

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The issue names no files, tests, or code entry points. Start by reading the linked Python implementation and the cited sections A.2 and A.3, then review the scaling-transformation paper; done means adding a rationalization procedure that preserves the system's degrees of freedom.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
backend
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.