17 тысяч замеров и один FreeStyle Libre: год данных о диабете у кошек

—

от автора

Привет, Хабр!

Почти год назад я рассказывал, как за 5 дней написал приложение Diabnostic для мониторинга диабета у своей кошки. В марте делился первым датасетом: 6 773 замера от 121 питомца. С тех пор произошло три вещи.

Смотри, Маня, тут есть графики!

Смотри, Маня, тут есть графики!

Первое: датасет вырос почти втрое — 16 796 ручных замеров от 166 питомцев за 12 месяцев (ноябрь 2025 — октябрь 2026). Методология та же, релизы напрямую сравнимы.

Второе: в приложении появился пользователь-энтузиаст, который начал выгружать данные из FreeStyle Libre, и в датасете появился второй файл — 10 418 точек непрерывного мониторинга (CGM). 94 дня из жизни одной кошки с диабетом, по ~96 замеров в день вместо 1-3 вручную.

Третье: готовя релиз, я нашёл в собственных данных то, чего там быть не должно. Об этом — ниже.

Оба файла анонимизированы и лежат на GitHub под CC BY-NC. Пулл-реквесты на анализ приветствуются.

Я разработчик, а не ветеринарный врач.
Всё ниже — наблюдения из данных исследования с самоотбором, а не клинические рекомендации.

Что изменилось за год: цифры

 март 2026

 октябрь 2026

Записей (ручные)

6 773

16 796

Питомцев

117

166 (153 кошки, 13 собак)

Медиана глюкозы

14.5 ммоль/л

14.5 ммоль/л

В целевом диапазоне 4-10

28.8%

27.8%

Гипогликемия < 3.5

4.9%

3.1%

Медиана записей на питомца

16

31

Самое интересное в этой таблице — чего в ней не изменилось. Медиана глюкозы за полгода не сдвинулась ни на десятую: 14.5 и 14.5. Выборка утроилась, а картина — нет: типичный питомец на платформе по-прежнему живёт с хронической гипергликемией, и доступность мониторинга сама по себе её не лечит.

Что выросло — это вовлечённость тех, кто остался: медиана записей на питомца удвоилась (16 → 31), питомцев со 100+ замерами стало 57. Ядро владельцев ведёт дневник месяцами.

Портрет пациента не изменился и совпадает с литературой: средний возраст кошки 10.6 года, 57% самцов.

Находка №1: ручной глюкометр слеп ночью. CGM это показал

Утренняя гипогликемия — классический кошмар владельца диабетика: действие вечернего инсулина заканчивается к 5-7 утра, и именно там кот может уехать вниз. В марте я писал, что худший контроль наблюдается в 5-7 утра. Но ручные данные там почти слепы: всего 8.3% замеров делается между 03:00 и 07:00, и гипо в них — 3%.

CGM-кошка закрыла этот пробел. Из 10 418 точек:

  • 229 ниже 3.5 ммоль/л, из них 75% — между 03:00 и 07:00

  • В ночном окне 03:00-06:59 гипо — 10.3% точек (против 3% в ручных данных)

  • Минимум — 2.0 ммоль/л; 11 дней из 94 имели хотя бы одну гипо-точку

Оговорка к этому графику: синие столбики в 4 утра тоже высокие по доле. Это не «глюкометр всё видит». Это отбор: ночью меряют, когда уже плохо. Сенсор меряет всегда, поэтому его 12% в 4:00 - знаменатель другой.

Оговорка к этому графику: синие столбики в 4 утра тоже высокие по доле. Это не «глюкометр всё видит». Это отбор: ночью меряют, когда уже плохо. Сенсор меряет всегда, поэтому его 12% в 4:00 — знаменатель другой.
11 сентября 2026. Гипо держалась с 03:11 до 06:47, минимум 2.2. Ручным глюкометром эту ночь не увидеть.

11 сентября 2026. Гипо держалась с 03:11 до 06:47, минимум 2.2. Ручным глюкометром эту ночь не увидеть.

Практический вывод владельцу: если вы меряете только «до/после укола» — а большинство меряет именно так, пики 08:00 и 20:00 — вы систематически пропускаете окно, где гипогликемия наиболее вероятна. Сенсор видит то, что глюкометр в 4 утра не увидит никогда.

Оговорка: это одна кошка, плохо компенсированная (медиана 20.3, TIR 12.4% - данные не популяционные). Но окно 03:00-07:00 как зона риска - ожидаемо и в ручных данных, просто там его толком не видно.

Оговорка: это одна кошка, плохо компенсированная (медиана 20.3, TIR 12.4% — данные не популяционные). Но окно 03:00-07:00 как зона риска — ожидаемо и в ручных данных, просто там его толком не видно.

Находка №2: среди питомцев были люди

Готовя релиз, я прогнал по датасету автовалидацию — и среди «безинсулиновых» профилей нашёл три, которые вели себя не как кошки.

Один — 8 месяцев аккуратного дневника: глюкоза 6-9 (человеческий, а не кошачий диапазон), дозы 8-10 единиц, заметки на английском «after ~15K steps», «after 3 pieces of sugar and cup of sweet grape juice» (человек купировал собственную гипо), лаборатория LifeLabs, сравнение показаний с Libre 2 и Libre 3. Владелец вёл в приложении дневник собственного диабета 2 типа — под видом кошки. Второй и третий — дозы 10-24 единицы и замер «2303» (мг/дл с человеческого глюкометра): кошка при 10+ единиц инсулина просто не выживет.

Итого 91 запись, 3 профиля — исключены. В первой статье я говорил, что мусорных записей в базе нет, потому что есть валидация диапазонов. Валидация честно отработала: 8-10 единиц и глюкоза 6-9 проходят в любые кошачьи рамки. Против правдоподобных данных нет приёма, кроме взгляда глазами.

Урок для публикующих датасеты: анонимизация удаляет имена, но не вид. Если ваш датасет о кошках — ищите записи, которые «слишком человеческие». Шаги, HbA1c, мг/дл вместо ммоль/л, человеческие дозы.

Находка №3: «4 кошки» оказались одним сенсором

Вторая история из той же валидации. В CGM-файле было 4 кошки — и валидатор взвыл: у «разных» кошек совпадают дата, время и глюкоза до десятой. Копнул: на общих таймстампах профили совпадают на 97-99% значений. Это один физический сенсор, который владелец залил в 4 профиля (обкатка интеграции: «попробуем ещё раз», «а теперь полный импорт»).

Если бы я опубликовал «4 кошки, 29 516 точек» — биолог-пользователь сделал бы из этого выводы про 4 животных. Я слил профили в одного питомца с дедупликацией: 30 096 → 10 418 точек. Три четверти «CGM-данных» были копиями.

Урок тот же, что в №2, но зеркальный: дубликаты в реальном времени не выглядят ошибкой — они выглядят как рост выборки. Считайте не строки, а физические источники.

Находка №4: пустой insulin_group != «без инсулина»

Мелкая, но важная деталь для пользователей датасета. Я сравнил профили «без инсулина» — а у 25 из 30 дозы инсулина прямо в записях. Просто тип в профиле не выбран. Если анализировать по insulin_group, четверть «безинсулиновых» уедет в неправильную группу.

Поэтому в README теперь явная оговорка: пустой insulin_group значит «тип не указан», а не «инсулина нет». Реальную терапию смотреть по insulin_dose_u > 0. Это не баг приложения — это честное поведение людей: доза важна каждый день, справочник — один раз.

Как строился релиз v2

Коротко о процессе, вдруг кому пригодится:

  • Экспорт из production PostgreSQL (те же фильтры, что в v1: глюкоза 0.1-50 ммоль/л)

  • Автовалидация: структура, диапазоны, дубликаты (pet, date, time), анонимность (grep по email/именам), непрерывность pet_id

  • Ручное разбирательство каждого флага валидатора на живой базе — так и нашлись люди и клонированный сенсор

  • Найденные артефакты v1 (тестовые записи дня запуска, повторные замеры в ту же минуту) оставлены как есть — чистка сломала бы сравнимость с релизом марта

Планы

  • Все ещё хочется повторить анализ инсулинов на выборке втрое больше — гларгин U100 против детемира на 166 питомцах

  • Всё ещё мало лабораторных анализов для коморбидности с ХБП

  • Всё ещё мало данных для реализации ML модели, предсказывающей возникновение гипо.


    К слову, если ваше животное больно диабетом и вам нужен удобный трекер —
    приходите. Чем больше будет данных, тем быстрее можно будет достичь реализации ML модели.

Датасет на GitHub, лицензия CC BY-NC.
Первая статья: habr.com/ru/articles/1010334.
Если нашли в данных что-то интересное — приходите с PR, упомяну в следующей статье.

Надеюсь, было интересно.

ссылка на оригинал статьи https://habr.com/ru/articles/1099294/