Добрый вечер, коллеги!
Мне всегда было интересно узнать, возможно ли предсказывать неизвестные STR по известным. Например, если у меня есть только Y67-тест, то насколько точным будет предсказание для него Y111?
С этим вопросом я поставил себе фитнес-цель на декабрь: узнать, насколько это возможно. И я узнал - это возможно и с весьма сносной точностью

Репозиторий:
https://github.com/Daemon2017/yImputerАдрес развернутого приложения:
http://185.86.145.42:8080 - это API, никакой Web-морды нет и не будет, т.к. мороки много, а потребителей мало.
Как пользоваться.
1) скачайте себе Postman'а
https://www.postman.com/downloads/?utm_source=postman-home 2) перейдите по ссылке
https://raw.githubusercontent.com/Daemon2017/yImputer/master/yImputer.postman_collection.json и нажмите Ctrl+S, чтобы сохранить JSON-файл с коллекцией запросов
3) откройте Postman'а и импортируйте в него коллекцию с помощью Ctrl+O
После этого, на вкладке Collections у Вас появится коллекция yImputer с двумя запросами (requests):

Далее возможно 2 взаимодействия:
4а) JSON Endpoint. На вкладке Body нужно разместить массив из JSON'ов (от 1 до сотен штук) в формате <"имя_маркера":значение_маркера> в любой последовательности. Например, для одного 12-маркерного случая:
[
{
"DYS393": 13,
"DYS390": 23,
"DYS19": 14,
"DYS391": 10,
"DYS385a": 14,
"DYS385b": 14,
"DYS426": 11,
"DYS388": 14,
"DYS439": 11,
"DYS389I": 12,
"DYS392": 11,
"DYS389II": 28
}
]
После чего требуется нажать синюю кнопку Send в правой верхней части - спустя пару мгновений справа появится ответ, содержащий предсказанные 111 маркеров в стандартном FTDNA'шном порядке:

4б) CSV Endpoint. На вкладке Body в столбце VALUE нужно навести курсор на текущее имя файла и, когда появится значок крестика, следует нажать на него - появится кнопка Select Files. Нажатие на нее приведет к открытию диалогового окна, где нужно указать путь до CSV-файла, содержащего гаплотипы (от 1 до сотен штук). Пример содержимого CSV-файла для 12-маркерного гаплотипа:
DYS393,DYS390,DYS19,DYS391,DYS385,DYS426,DYS388,DYS439,DYS389I,DYS392,DYS389II
13,23,14,10, 14-14,11,14,11,12,11,28
Вот полный набор STR'ов для заголовка таблицы:
DYS393;DYS390;DYS19;DYS391;DYS385;DYS426;DYS388;DYS439;DYS389I;DYS392;DYS389II;DYS458;DYS459;DYS455;DYS454;DYS447;DYS437;DYS448;DYS449;DYS464;DYS460;Y-GATA-H4;YCAII;DYS456;DYS607;DYS576;DYS570;CDY;DYS442;DYS438;DYS531;DYS578;DYF395S1;DYS590;DYS537;DYS641;DYS472;DYF406S1;DYS511;DYS425;DYS413;DYS557;DYS594;DYS436;DYS490;DYS534;DYS450;DYS444;DYS481;DYS520;DYS446;DYS617;DYS568;DYS487;DYS572;DYS640;DYS492;DYS565;DYS710;DYS485;DYS632;DYS495;DYS540;DYS714;DYS716;DYS717;DYS505;DYS556;DYS549;DYS589;DYS522;DYS494;DYS533;DYS636;DYS575;DYS638;DYS462;DYS452;DYS445;Y-GATA-A10;DYS463;DYS441;Y-GGAAT-1B07;DYS525;DYS712;DYS593;DYS650;DYS532;DYS715;DYS504;DYS513;DYS561;DYS552;DYS726;DYS635;DYS587;DYS643;DYS497;DYS510;DYS434;DYS461;DYS435
Такой документ Вы легко можете состряпать сами, копируя гаплотипы из проектов FTDNA

Обратите внимание, что CSV=Comma Separated Value, т.е. "том, разделенные запятыми", но в MS Excel есть старинный дефект, из-за которого, без дополнительных донастроек, действие "Меню->Экспорт->Изменить тип файла->CSV" приведет к сохранению файла, где разделителем будет не запятая, а точка с запятой!

На этот случай, в API предусмотрена возможность изменения разделителя, который можно задать аргументом в адресной строке Postman'а:
/predict_csv?sep=;
/predict_csv?sep=,
/predict_csv?sep=.
В целом, можно использовать любой разделитель - должно работать.
Но у MS Excel есть еще один прикол: записи в формате "7-9" он будет считать днем и месяцем даты, превращая их в 07.09.2022. Запись "7-7-7" он превратит в 07.07.2007. Так что лучше пользоваться Google Таблицами:
https://docs.google.com/spreadsheets/u/0/Когда и файл, и разделитель указаны, можно нажимать кнопку Send - Вы получите ответ с предсказанными STR в формате FTDNA, но без дефисов между палиндромами:

Ограничения:
- не умеет работать с гиперпалиндромными палиндромами. Т.е. если Ваш DYS385 состоит не из 2 частей (11-14), а из 3 частей (11-14-15), то я предлагаю подставлять в DYS385a наименьшее значение, а в DYS385b - наибольшее. Это даст наилучший результат, т.к. алгоритм обучался именно так. Аналогично с DYS464 - если у Вас он состоит не из 4 частей, а из 6, то надо брать 2 наименьших и 2 наибольших значения.
- не умеет работать с палиндромностью привычно непалиндромных маркеров. Насколько я помню, DYS19 любит запалиндромиться где-то у каждого 1000-го. Попробуйте подставлять среднее значение маркеров, т.е. (17+15)/2=16
- не умеет работать с нулевыми маркерами - к таким относится DYS425
https://www.familytreedna.com/groups/null-425/about/background и некоторые другие. Алгоритм не обучался на таких ситуациях, так что наличие 0 на месте одного из маркеров может навредить точности. Попробуйте найти ближайшего родича с ненулевым значением и взять его значение.
- алгоритм обучался на современных образцах, так что при попытке использовать его на дДНК, скорее всего, получится мусор
Применение:
- если Вам нужно построить древо STR для нескольких десятков наборов, но среди них, в основном, Y67 и очень мало Y111, то хорошей идеей будет попытаться импутировать 67 до 111, а уже потом строить древо После переоценки качества, стало очевидно, что для точного предсказания Y111, недостаточно Y67 - нужно около 90 маркеров
- если Вам попался очень интересный образец, но он сделан не в FTDNA (допустим, какая-нибудь 17 или 27-маркерная панель) и потому его нельзя задействовать в построении древа, то можно попробовать импутировать его, откинув наименее предсказуемые маркеры- YFull прочитала 87.5% STR из моего BigY500 и 95% STR из моего WGS Dante Labs - возможно, что алгоритм можно применить для того, чтобы каждому образцу предсказывать 100% маркеров и использовать их при сравнении или оценке TMRCA по STR
Сервис размещен в VK Cloud'е до начала весны, а дальше посмотрим.
Исходный код размещаю под GNU GPL: пользуйтесь, кто хочет. Если будете создавать форк, дорабатывать код и укажете авторство, то буду очень благодарен

Если есть пожелания и предложения - пишите, попробую воплотить.