Система искусственной поджелудочной железы, известная как AndroidAPS, является одним из наиболее сложных и продвинутых инструментов для управления диабетом. В основе её работы лежит прогнозирование уровня глюкозы в крови с использованием различных данных и моделей. В этой статье мы подробно рассмотрим, как AndroidAPS формирует прогноз уровня глюкозы и на его основе принимает решения о подаче инсулина.
Казалось бы, когда мы прогнозируем что то, то должны получать единый прогноз для наилучшего предсказания глюкозы. При этом, единый прогноз может иметь разное количество влияющих на него факторов. Однако, на взгляд может показаться, что алгоритмах Android APS используется несколько прогнозов. Однако, это не совсем так. Попробую в этой статье разобраться как же всё-таки работает прогноз Android APS. Пропущу прелюдию о том, что на самом деле это алгоритмы OpenAPS и что данная статья всего лишь попытка понять и вместе с вами порассуждать о принципах формирования прогноза в AndroidAPS. Так же я буду приводить в таких "" кавычках текст из документации Android APS.
Следствием прогноза является определение количества инсулина, необходимого организму (или отсутствие в его потребности).
Прогнозом (в отличие от того к чему мы обычно привыкли) здесь называется ПЕРВИЧНАЯ модель прогнозирования будущего на основе определенных показателей. Первичная, потому что сформировав первичную модель, мы будем сравнивать ее (система будет сравнивать конечно же) с подобными моделями и в конечном счете решать какой же ФИНАЛЬНЫЙ прогноз построить. Финальным назовем тот прогноз, который принимается в целях дозировки инсулина. Ведь логично предположить, что несколько моделей никак не могут лечь в основу одного решения о подачи определенного количества инсулина? нам надо или выбрать или посчитать финальный прогноз на их основе. Именно это и делает система.
Модели ПЕРВИЧНОГО прогноза
Итак, у нас есть два прогноза, которые прогнозируют без углеводов ("без значительного усвоения углеводов"): eventualBG и IOBpredBGs
Один прогноз, который прогнозирует наихудший сценарий (это кажется очень полезным): ZTpredBGs ("пытается предсказать “наихудший вероятный случай”, если наблюдаемое поглощение углеводов внезапно прекратится и если будет применяться нулевая базальная скорость до тех пор, пока уровень сахара в крови не начнет повышаться до / выше целевого уровня").
И два прогноза в которых предусматриваются углеводы: COBpredBGs и UAMpredBGs ("делается попытка предсказать, как долго будет продолжаться наблюдаемое повышение уровня сахара в крови, подобрать соответствующие дозы для объявленных и необъявленных приемов пищи и для всего остального, что вызывает устойчивое повышение уровня сахара в крови")
"Фокусы" начинаются дальше. "Прогнозы уровня сахара в крови на основе COB требуют объявления блюд с приблизительной оценкой содержания углеводов. Подсчет углеводов не обязательно должен быть точным: любой оценки в пределах 1,5 раза от фактического значения, как правило, будет достаточно для почти оптимальной дозировки, поскольку прогнозы на основе COB и UAM смешиваются (при этом дозировка на основе UAM ограничена прогнозами ZTpredBGs) для выработки рекомендаций по дозированию. Если информация о количестве углеводов не указана, прогнозы на основе UAM могут быть использованы для реактивной дозировки при повышении приема пищи, чего с помощью Fiasp достаточно, чтобы уровень сахара в крови довольно быстро вернулся в норму после необъявленного приема пищи."
Так же есть дополнительная корректировка, влияющая на прогноз, описанная здесь:
"Когда объявления о потреблении углеводов недоступны или когда заявленные углеводы в основном усваиваются, а прогнозы на основе COB менее надежны, также можно предсказать, что наблюдаемые отклонения постепенно вернутся к нулю в течение некоторого периода времени. (Термин “отклонение” рассчитывается для обозначения того, насколько в настоящее время повышается или понижается уровень глюкозы относительно того, что он должен делать, основываясь исключительно на активности инсулина.) Как только отклонения достигнут максимума и будут уменьшаться с разумной скоростью, расчеты UAM oref0 предполагают, что отклонения будут продолжать уменьшаться с той же скоростью, пока не достигнут нуля. Если они уменьшаются, но слишком медленно, предполагается, что они будут линейно уменьшаться до нуля в течение 3 часов. Если отклонения все еще увеличиваются, предполагается, что они немедленно достигнут максимума и начнут уменьшаться со скоростью, равной ⅓ скорости, с которой они увеличились по сравнению с недавним минимумом." Это и есть элемент прогноза.
eventualBG
"Самый простой и старый прогноз, называемый eventualBG, использует традиционную математику болюсного калькулятора.
В частности, для naive_eventualBG установлено значение current BG - IOB *ISF."
То есть "простой расчет конечной глюкозы" рассчитывается как Текущая глюкоза минус Инсулин на борту умноженный на Чувствительность к инсулину. Это логично, до использования систем искусственной поджелудочной мы измеряли глюкометром и имея например значение 8 ммол/л мы вкалывали 1 ед если ISF был 2 для корректировки уровня глюкозы с 8 до 6. Что ж, через некоторое время мы могли получить 6.
Он также вычисляет термин “отклонение”, который представляет, насколько уровень глюкозы в данный момент повышается или понижается относительно того, что он должен делать, основываясь исключительно на активности инсулина. Прогнозируется, что эти отклонения сохранятся в течение следующих 30 минут (или, что эквивалентно, будут линейно уменьшаться от текущего значения до нуля в течение следующих 60 минут).
Тогда eventualBG = naive_eventualBG + отклонение
Здесь все понятно, если мы отклонились, то предполагаем что это отклонение еще некоторое время будет сохраняться, однако в остальном имеем простейший расчет. Как если бы мы знали что сахар еще немного повысится так как сьели мармеладку и при этом в остальном сохраняем все остальные расчеты.
При этом, eventualBG подразумевает расчет только финального показателя глюкозы, например как и было в примере выше, мы знаем что "через 2 часа" глюкоза будет 6, но не знаем какая она будет в промежутке. "через 2 часа" это когда весь введенный для данного понижения инсулин будет абсорбирован.
IOBpredBGs
eventualBG по своей природе предсказывает только конечное значение BG, как только вся активность инсулина вступит в силу.
Для того, чтобы предсказать, что BGs будет делать в промежутке времени, oref0 выполняет вычисление, аналогичное вычислению eventualBG, но каждые 5 минут (в течение 4 часов). В этом расчете прогнозируемое влияние инсулина на уровень глюкозы в крови (predBGI) и прогнозируемое отклонение (predDev) рассчитываются для каждого 5-минутного интервала, что позволяет нам прогнозировать значение BG для каждого интервала, которые хранятся в массиве IOBpredBGs. Как и при расчете eventualBG, прогнозируется линейное уменьшение отклонений от текущего значения до нуля в течение следующих 60 минут, тем самым прогнозируется элемент ”импульса".
Что учитывает данный прогноз - достаточно понятно. Это уже продвинутый уровень который чаще всего мы не используем в стандартном расчете "в голове".
ZTpredBGs
"Другой довольно простой прогноз касается того, что произойдет в “наихудшем вероятном случае”, если наблюдаемое поглощение углеводов внезапно прекратится и будет применяться нулевая базальная скорость до тех пор, пока уровень сахара в крови не начнет повышаться до / выше целевого уровня."
То есть каким будет прогноз, если вдруг мы убираем влияющие на повышение углеводы и оставляем только инсулин (без дополнительного ввода).
"Для этого oref0 просто вычисляет, каким будет BGI каждые 5 минут, если он немедленно установит длительный нулевой базал, и использует эти BGI (без каких-либо отклонений) для прогнозирования значения BG для каждого интервала, которые хранятся в массиве ZTpredBGs."
Данный прогноз можно продемонстрировать на таком примере: мы покушали, ввели инсулин, но по какой то причине (например кола оказалась безуглеводой) углеводы не подейстовали. Что будет при текущем значении инсулина, если мы отключаем его дополнительную подачу? Каким будет прогноз на следующее время? Это и вычисляет данный прогноз.
COBpredBG
"Расчет прогнозируемого BG в сценарии, основанном на COB, зависит от расчета COB. В oref0 COB рассчитывается на основе наблюдаемых отклонений с момента поступления углеводов, исходя из предположения, что положительные отклонения были вызваны усвоением углеводов, а любые низкие или отрицательные отклонения были вызваны чем-то другим (например, физической активностью), но что углеводы будут продолжать перевариваться / всасываться в течение этого времени с настраиваемой минимальной скоростью.
Если пользователь выбирает ввести болюс на прием пищи, то oref0 может просто подождать, пока не появятся положительные отклонения, указывающие на усвоение углеводов, и может предположить, что эти отклонения постепенно уменьшатся до нуля в течение периода времени, достаточного для того, чтобы “израсходовать” все оставшиеся углеводы. В этом сценарии oref0 может просто выполнить те же вычисления, что и для IOBpredBGs, но использовать постепенно уменьшающееся прогнозируемое значение воздействия углеводов (predCI) вместо predDev."
Вот мы выявили еще первичные прогнозы в модели. predCI и predDev. Понятно, что используя IOBpredBGs + predCI мы легко получим примерные сахара на будущее. Если бы мы могли строить такую логику в голове, то было бы очень логично построить именно такую предсказательную модель для начала, если нет доп факторов таких как физ нагрузка и проч.
"Прежде чем будет замечено такое всасывание углеводов, oref0 должен спрогнозировать, насколько быстро углеводы, вероятно, начнут всасываться, чтобы убедиться, что по крайней мере часть инсулина, необходимого для приема пищи, поступает через SMB, если пользователь еще не ввел болюсно (в достаточном количестве). Одной из целей разработки oref0 было то, что пользователям не нужно было вводить предположения относительно скорости усвоения пищи. Вместо этого oref0 производит консервативную оценку вероятного усвоения углеводов на основе размера порции, того, как давно она была введена, текущего коэффициента чувствительности (по автосенсам или переопределению целевого значения температуры). Для приемов пищи <= 60 г начальная оценка времени усвоения начинается с 3 часов, а для > = 90 г предполагается, что первые 90 г усвоятся за 4,5 часа. Все, что превышает 90 г, игнорируется до тех пор, пока не будет наблюдаться фактическое усвоение углеводов при увеличении дозы до 90 г."
Что ж, оценка усвоения разных углеводов у разных людей - это предмет дополнительного исследования.
"Если усвоение углеводов остается низким или снизится через некоторое время, oref0 предсказывает, что оставшийся COB будет усваиваться медленнее, чем при только что введенных углеводах. Это рассчитывается как 1,5 кратное количеству последних углеводов, поэтому предполагается, что для усвоения любых углеводов, которые не усваиваются по истечении 1 часа, потребуется дополнительно 1,5 часа, что означает 4,5 часа для <= 60 г початков и 6 часов для > = 90 г."
Данную логику отлично видно иногда в не самый подходящей и правильной ситуации к сожалению когда как раз мы поели 20 углей, далее была физ нагрузка и после того как эти угли не отобразились как усвоенные (то есть висят те же например 15 оставшихся углей) - но фактически они были усвоены с помощью физ нагрузки, тогда они будут еще долго висеть и плюсоваться к тем новым углям что мы только что снова поели. Итого у нас будет излишнее количество углеводов на борту.
"Как только время усвоения рассчитывается для еще не усвоенных углеводов, оно преобразуется в кривую усвоения углеводов в форме / , которая увеличивается от текущего уровня усвоения до пикового значения на полпути к предполагаемому времени усвоения, а затем линейно уменьшается до нуля в течение предполагаемого времени усвоения (оставшегося периода). Скорость усвоения углеводов, прогнозируемая на оставшийся промежуток времени, рассчитывается таким образом, чтобы гарантировать, что все углеводы (до 90 г) будут усвоены за оставшийся промежуток времени.
UAMpredBGs
"Когда объявления о потреблении углеводов недоступны или когда заявленные углеводы в основном усваиваются, а прогнозы на основе COB менее надежны, также можно предсказать, что наблюдаемые отклонения постепенно вернутся к нулю в течение некоторого периода времени. Как только отклонения достигнут максимума и будут уменьшаться с разумной скоростью, расчеты UAM oref0 предполагают, что отклонения будут продолжать уменьшаться с той же скоростью, пока не достигнут нуля. Если они уменьшаются, но слишком медленно, предполагается, что они будут линейно уменьшаться до нуля в течение 3 часов. Если отклонения все еще увеличиваются, предполагается, что они немедленно достигнут максимума и начнут уменьшаться со скоростью, равной ⅓ скорости, с которой они увеличились по сравнению с недавним минимумом."
Ну что ж, рассмотрев прогнозы, можем сказать, что теперь надо перейти ко главному вопросу - как же на самом деле происходит прогноз глюкозы? Ведь данные прогнозы могут как заменять друг друга так и комбинироваться, верно? На этот счет есть так же комментарий в документации.
"Смешивание соответствующих прогнозов
После того, как oref0 сгенерирует все соответствующие прогнозы (различные массивы predBG, в зависимости от наличия или отсутствия COB и положительных отклонений), он:"
Мы сразу понимаем что все прогнозы строятся в любом случае и они есть у нас под рукой.
"объединяет их для получения оценок наименьшего прогнозируемого уровня глюкозы, который, вероятно, будет наблюдаться в течение периода времени, соответствующего дозированию.,"
На этом этапе мы получили прогноз с самым низким прогнозируемым сахаров крови.
"вычисляет, сколько инсулина требуется (insulinReq), чтобы приблизить minimum predicted BG к целевому,"
Замечательно, если наш уровень глюкозы даже самый низкий из прогнозируемых все еще выше цели - мы вычислим сколько же инсулина необходимо для приближения к цели.
"затем использует insulinReq для вычисления соответствующего microbolus or temp basal."
И вот мы получили сколько же инсулина нам требуется для корректировки глюкозы к целевому значению!
Далее, в зависимости о том, есть ли "объявление об употреблении углеводов".
"Если объявление о потреблении углеводов отсутствует, minPredBG обычно устанавливается на большее значение из minIOBPredBG, наименьшее значение IOBpredBG (начиная с 90 м. в будущем) и minZTUAMPredBG, которое является средним значением наименьшего UAMpredBG (начиная с ~ 60 м. в будущем, minUAMPredBG) и наименьшего ZTpredBG (начиная немедленно, minZTGuardBG).
Когда присутствует COB из объявления о приеме пищи, oref0 устанавливает minPredBG, смешивая minPredBG на основе UAM и ZT, описанный выше (minZTUAMPredBG) с наименьшим COBpredBG (начиная с ~ 90 м в будущем, minCOBPredBG), в соответствии с долей углеводов, оставшихся в виде COB (fractionCarbsLeft).
Затем insulinReq устанавливается равным разнице между minPredBG и target BG, деленной на ISF. В каждом цикле половина insulinReq доставляется в виде микроболюса, и в каждом последующем цикле minPredBG пересчитывается для вычисления нового insulinReq и микроболюса.
Можем так и сказать, что настоящим является сочетание которое выдается на этом этапе – на этапе insulinReq? Ведь именно здесь мы использовали как minPredBG так и ISF.
В файлеdetermine-basal.js параметр insulinReq вычисляется на основе нескольких факторов, таких как прогнозируемый уровень глюкозы (minPredBG), целевой уровень глюкозы (target_bg), и чувствительность к инсулину (ISF).
Логика расчета insulinReq
Основной расчет:
insulinReq рассчитывается как разница между прогнозируемым уровнем глюкозы и целевым уровнем, деленная на чувствительность к инсулину (ISF). Это вычисление отражает количество инсулина, необходимое для снижения уровня глюкозы до целевого значения.
Ограничение максимальной дозы:
После вычисления insulinReq его значение ограничивается максимально допустимым значением max_iob, чтобы предотвратить введение избыточного количества инсулина.
Код расчета insulinReq
Вот фрагмент кода, где происходит расчет insulinReq:
// insulinReq is the additional insulin required to get minPredBG down to target_bg
insulinReq = round( (Math.min(minPredBG, eventualBG) - target_bg) / future_sens, 2);
// if that would put us over max_iob, then reduce accordingly
if (insulinReq > max_iob - iob_data.iob) {
rT.reason += "max_iob " + max_iob + ", ";
insulinReq = max_iob - iob_data.iob;
}
Объяснение кода:
Первичный расчет:
insulinReq вычисляется как разница между минимальным прогнозируемым уровнем глюкозы (minPredBG) или eventualBG и целевым уровнем глюкозы (target_bg), деленная на чувствительность к инсулину (future_sens).
Ограничение по max_iob:
После первичного расчета программа проверяет, не превышает ли рассчитанная доза инсулина максимально допустимое значение активного инсулина (max_iob). Если превышает, insulinReq уменьшается до допустимого значения.
Округление:
Результат округляется до двух знаков после запятой для точности дозировки.
Вывод:
insulinReq определяет, сколько инсулина требуется для достижения целевого уровня глюкозы. Программа корректирует это значение, чтобы избежать избыточной дозировки, используя заданное ограничение max_iob.
При этом хочу отметить, что
Для расчетов прогнозов (avgPredBG, IOBpredBG, UAMpredBG, COBpredBG):
В прогнозах такие значения, как avgPredBG, IOBpredBG, UAMpredBG, и COBpredBG, используют ISF для вычисления ожидаемого влияния активного инсулина на уровень глюкозы.
Эти прогнозы строятся на основе текущих данных о глюкозе и активном инсулине, и ISF помогает предсказать, насколько сильно изменится уровень глюкозы под воздействием оставшегося инсулина.
Влияние на insulinReq:
После расчета прогнозов программа определяет, сколько инсулина необходимо ввести для достижения целевого уровня глюкозы, и ISF снова используется для перевода этой разницы в необходимую дозу инсулина.
Как формируется прогноз:
Расчет eventualBG:
Программа сначала рассчитывает, каким должен быть уровень глюкозы в будущем на основе текущего уровня, активности инсулина и чувствительности.
Этот прогноз корректируется на основе возможных отклонений, учитывая такие вещи, как потребление углеводов и скорость их поглощения.
Комбинирование прогнозов:
Программа создает несколько прогнозов, основанных на различных моделях: на активном инсулине, углеводах и так далее.
Автор: AIAPS