?

Log in

No account? Create an account
Блочная схема НК
evfratov
Дикслеймер: данный пост является служебной записью для проекта по сборке носимого компьютера, принципиальная схема шаблонная не содержит каких-то нововведений.

На данный момент существует множество компактных одноплатных компьютеров с низким энергопотреблением, достаточно просто оставить это здесь. Для питания системы необходимы аккумуляторные батареи, вариантов которых много. Для средств вывода информации есть сложности только с изображением, для которого единственным приемлемым решением считается HMD, которых существует уже немало, но остаются сложности заставить работать нормально. А стандартные средства ввода, типа "клавиатура-мышь", реализованы в виде компактных клавиатур.
drawing-circuit-man
На данной шаблонной, в концептуальном плане, схеме изображена система с напоясным носимым компьютером C, питаемым от аккумулятора B через кабель питания SC. Интерфейсы вывода звука E (наушник) и изображения H (HMD) монтируются на голове носителя вместе с микрофоном М, а в качестве основного средства управления рассматривается беспроводная мини-клавиатура K. Важно то, что практически все компоненты представлены на рынке (сложности есть только с HMD) и заставить их работать в единой системе не представляется как задача высокой сложности.

Хороший курс для введения в нейробиологию
evfratov
Дисклеймер: описанное ограничено личным мнением.

logo-SNB
Некоторое время назад был прослушан курс Corsera Synapses, Neurons and Brains, этот курс хорошо сочетает разъяснение базовых знаний нейробиологии (работа нейрона), современное состояние нейробиологии (принципы и возможности текущих методов) и широту охвата тем. Ещё более примечательно то, что в курсе присутствуют весьма продвинутые вещи (в роде обоснования необходимости инвазивных методов с миллионами электродов) и адекватные рассказы об хайпово-раздуваемых проектах без хайпа. Прослушивание курса настоятельно рекомендуется фанатам загрузки и в приказном порядке  сторонникам трансгуманизма, изучавшим нейрофизиологию по Ghost in the Shell .

Терминология ЦБ
evfratov
Дисклеймер: данный пост является сведением вместе описаний основных "составных частей" ЦБ в известных источников.

Поскольку плохо при каждой разработке велосипедов вводит собственную терминологию, следует обойти распространённые сейчас ключевые для ЦБ понятия.
Пройдёмся в хронологическом порядке:
Концепция Memex Ванневана Буша как системы захвата, хранения и доступа к информации, с которой человек работает, если интерпретировать эту концепцию очень широко - соответствует по описанию прикладному ЦБ ("расширитель памяти", практическое использование захваченных данных). А понятие Lifelog как захват (максимально больного количества) данных на протяжении жизни - соответствует этапу захвата данных, он у меня фигурирует как первый этап ЦБ. Понятие Whole Brain Emulation (WBE) является наиболее "официальным" и научным термином загрузки сознания (и правильно является), загрузка является главной целью ЦБ, с помощью гипотетических процедур восстановления модели личности из захваченных данных (у меня это фигурирует как второй этап ЦБ), эти процедуры методологически являются решением обратной задачи (для этого была временно введена аббревиатура Solving Reverse Problem of WBE - SRP WBE) эмуляции мозга (получение модели мозга из данных поведения), поскольку сама задача WBE является получением (данных) поведения из модели мозга. Более официальная и более научная форма loosely-copuled off-loading, LCOL как одна из возможных технологий загруки, проработанная нейробиологом и апологетом загрузки Рэндалом Кёнэ.

Таким образом ЦБ является одной из вариантов загрузки;
первый этап ЦБ - захват данных - это Lifelog;
второй этам ЦБ - восстановление личности, SRP WBE - это LCOL;
практическое применение ЦБ - вспомогательная память - реализация концепции Memex;

Ещё следует обратить внимание на некоторых людей: Стив Мэнн позиционируется как пионер в разработке Lifelog и носимых компьютеров, а Гордон Белл (судя по информации он всё ещё жив, несмотря на возраст) как разработчик реализации системы, подобной Memex - MyLifeBits, экспериментатор в Lifelog и популяризатор идей и практик прикладного ЦБ, описанных книге Your Life, Uploaded и даже теоретического применения ЦБ по прямому назначению.

Пост следует перевести на английский язык.

Немного молекулярной биологии, post 1
evfratov
Дисклеймер: в рамках РТД обсуждался вопрос об полезных основах современной биологии для ТГ, в силу своей специальности я начну кратко описывать в адаптированной неформальной форме основные (и примечательные для ТГ) моменты. Биоинженер, помни! Ты должен всё это знать и ты мне это расскажешь на коллоквиуме, зачёте и экзамене!

Нет нужды напоминать основы биохимии, все помнят что основными компонентами живого являются белки, жиры, нуклеиновые кислоты, вода, неорганические вещества и продукты обмена веществ (метаболизма) как всяческие производные вышеназванного; при этом белки это функциональные исполнители всего-всего, жиры - главный компонент мембран и запас энергии, углеводы используются как носитель/оперативный запас энергии и для конструкционных материалов, нуклеиновые кислоты главным образом являются информационным и регуляторым агентом, вода это основная среда для жизни и неорганические вещества обеспечивают физико-химический "фон" чтобы это всё работало и ещё являются специфическими компонентами для многих ферментов.
Также все помнят основы молекулярной биологии, что ДНК это главное (и единственное) хранилище информации в клетке (хромосомы), изредка используемое как агент переноса генов (плазмиды и прочие векторы); РНК используется как временный носитель информации (мРНК), реже как регулятор чего-нибудь (РНК-интерференция, рибопереключатели) и ещё реже как исполняющий агент (рибозимы) за одним громадным исключением (рибосома); что белки являются главенствующими компонентами живого, которые что-то делают, поскольку делаю они всё - превращение метаболитов, перенос веществ (через мембраны и пр.), детекция веществ, передача сигнала, детекция физико-химических условий, механическую работу, регуляция других компонентов,...

В этом посте мы, после того как вспомнили основной бэкграунд, рассмотрим "центральную догму молекулярной биологии" вообще и что там насчёт контроля, который необходим для управления биологическими процессами и системами.
Read more...Collapse )

Новые алгоритмы в широкоформатном скрининге
evfratov
Дисклеймер: данный пост описывает захват нескольких новых видов данных.


### группы
# список для данных групп
extend[['gropus']] <- list()
for (id in selected$uid) {
  # загрузка информации о группах
  Sys.sleep(0.3)
  download.file(url = paste0('https://api.vk.com/method/groups.get.xml?user_id=', id, '&extended=1', '&access_token=', token), destfile = paste0('/tmp/groups-', id, '.xml'), method='wget')
  # парсинг XML
  xmldata <- xmlParse(paste0('/tmp/groups-', id, '.xml'))
  extend[['gropus']][[id]] <- xmlToDataFrame(nodes = xmlChildren(xmlRoot(xmldata)))
  if (ncol(extend[['gropus']][[id]]) != 1) {
    # убрать первый столбец и строку
    extend[['gropus']][[id]] <- extend[['gropus']][[id]][-1,-1]
    # оставить только первые 3 столбца
    extend[['gropus']][[id]] <- extend[['gropus']][[id]][,1:3]
    # записать число групп в ngroups
    selected[selected$uid == id,]$ngroups <- nrow(extend[['gropus']][[id]])
  }
  # контрольный вывод
  print(paste(id, selected[selected$uid == id,]$ngroups))
  # вывод в db
  write.table(extend[['gropus']][[id]], paste0('db/groups/groups-', id, '.tab'), quote = F, sep = "\t", row.names = F, col.names = T)
}

Created by Pretty R at inside-R.org




# подписки
# список для данных подписок
extend[['subs']] <- list()
# число подписок
selected$nsubs <- rep(0, nrow(selected))
# число T-подписок
selected$Tsubs <- rep(0, nrow(selected))
 
for (id in selected$uid) {
  # загрузка информации о подписках
  Sys.sleep(0.4)
  file.create(paste0('/tmp/subs', id))
  while (file.info(paste0('/tmp/subs', id))$size == 0) {
    try(download.file(url = paste0('https://api.vk.com/method/users.getSubscriptions.xml?user_id=', id, '&access_token=', token), destfile = paste0('/tmp/subs', id), method='curl'))
  }
  # парсинг XML
  xmldata <- xmlParse(paste0('/tmp/subs', id))
 
  if (xmlToDataFrame(getNodeSet(xmldata, '//groups/count'))[1,] != 0) {
    # продолжение парсинга XML
    extend[['subs']][[id]] <- xmlToDataFrame(xmlRoot(xmldata)[['groups']][['items']])
    colnames(extend[['subs']][[id]]) <- 'subid'
    # посчитать число подписок
    selected[selected$uid == id,]$nsubs <- nrow(extend[['subs']][[id]])
    # сохранить список групп
    groups <- as.vector(extend[['subs']][[id]]$subid)
    # затереть датафрейм
    extend[['subs']][[id]] <- data.frame()
    # получение имён групп
    for (k in 1:ceiling(length(groups)/200)) {
      tmp <- groups[(1 + (k-1) * 200):(k * 200)]
      tmp <- na.omit(tmp)
      Sys.sleep(0.4)
      file.create(paste0('/tmp/subsi', id, '-', k))
      while (file.info(paste0('/tmp/subsi', id, '-', k))$size == 0) {
        try(download.file(url = paste0('https://api.vk.com/method/groups.getById.xml?group_ids=', paste0(tmp, collapse = ','), '&access_token=', token), destfile = paste0('/tmp/subsi', id, '-', k), method='wget'))
      }
      # парсинг XML
      xmldatasub <- xmlParse(paste0('/tmp/subsi', id, '-', k))
      tmp <- xmlToDataFrame(nodes = xmlChildren(xmlRoot(xmldatasub)))
      # отбор только ключевой информации
      tmp <- tmp[,1:3]
      if (nrow(extend[['subs']][[id]]) == 0) {
        # сохранение в расширенный датафрейм
        extend[['subs']][[id]] <- tmp
      } else {
        extend[['subs']][[id]] <- rbind(extend[['subs']][[id]], tmp)
      }
    }
 
    # посчитать число Т-подписок
    selected[selected$uid == id,]$Tsubs <- sum(extend[['subs']][[id]]$screen_name %in% target)
  }
  system(paste0('rm /tmp/subsi', id, '*'))
 
  # вывод данных
  write.table(extend[['subs']][[id]], paste0('db/subs/subs-', id, '.tab'), quote = F, sep = "\t", row.names = F, col.names = T)
  # контрольный вывод
  print(paste(id, selected[selected$uid == id,]$nsubs, selected[selected$uid == id,]$Tsubs, round(which(selected$uid == id)/nrow(selected)*100, 1)))
 
}

Created by Pretty R at inside-R.org



Таким образом можно получать списки групп и подписок пользователей, сохраняя в библиотеки. Используя значения числа target-групп, в которых состоят пользователи, и подписок можно вычислят "коэффициет идеологичности" - T-коэффициент, нормируя сумму T-подписок и T-групп на сумму числа групп и подписок:

### контроль степени идеологичости
### прежде чем анализировать данные коментов
selected$NTC <- log((selected$Tcoeff + selected$Tsubs)/(selected$ngroups + selected$nsubs)) + 5
# слишком большие отклонения от положительных контролей, метод пока не применим

Created by Pretty R at inside-R.org

Увы.. кстати прибавление 5 сделано для удобства, т.к. максимум распределения именно на 2,5.

Важно то, что списки подписок и групп применимы для text mining и кластерного анализа.

Тотальное выкачивание комментариев от пользователя со стены пользователя:



# стена
# список для данных стены
extend[['wall']] <- list()
for (id in selected$uid) {
  # загрузка информации о стене - посчёт числа коментов
  Sys.sleep(0.4)
  file.create(paste0('/tmp/wall', id))
  while (file.info(paste0('/tmp/wall', id))$size == 0) {
    try(download.file(url = paste0('https://api.vk.com/method/wall.get.xml?owner_id=', id, '&count=1', '&filter=owner', '&access_token=', token), destfile = paste0('/tmp/wall', id), method='curl'))
  } 
  # парсинг пробного XML
  xmldata <- xmlParse(paste0('/tmp/wall', id))
  # подсчёт числа коментов
  ncomments <- as.vector(xmlToDataFrame(getNodeSet(xmldata, '//response/count'))[1,1])
 
  # получение всех коментов
  if (!is.null(ncomments)) {
    ncomments <- as.numeric(ncomments)
    for (k in 1:ceiling(ncomments/100)) {
      Sys.sleep(0.4)
      file.create(paste0('/tmp/wall', id, '-', k))
      while (file.info(paste0('/tmp/wall', id, '-', k))$size == 0) {
        try(download.file(url = paste0('https://api.vk.com/method/wall.get.xml?owner_id=', id, '&count=100', '&filter=owner', '&offset=', (k-1) * 100, '&access_token=', token), destfile = paste0('/tmp/wall', id, '-', k), method='curl'))
      }
      # парсинг основного XML
      xmldata <- xmlParse(paste0('/tmp/wall', id, '-', k))
      tmp <- sapply(getNodeSet(xmldata, '//response/post/text'), xmlValue)
      # удалить коменты без текста
      tmp <- tmp[tmp != '']
      # проверить что в блоке вообще есть коменты с текстом
      if (length(tmp) != 0) {
        tmp <- as.data.frame(tmp)
        colnames(tmp) <- 'comment'
        # запись в расширенный датафрейм
        if (is.null(extend[['wall']][[id]])) {
         extend[['wall']][[id]] <- tmp
        } else {
         extend[['wall']][[id]] <- rbind(extend[['wall']][[id]], tmp)
        }
      }
    }
    system(paste0('rm /tmp/wall', id, '*'))
 
    # забив если коментов 0
    if (ncomments == 0 | is.null(extend[['wall']][[id]])) {
      extend[['wall']][[id]] <- data.frame()
    }
 
    # контрольный вывод
    print(paste(id, ncomments, nrow(extend[['wall']][[id]])))
  } else {
    # забив если проблемы с получением коментов
    extend[['wall']][[id]] <- data.frame()
  }
 
  # вывод в библиотеку файлов
  if (nrow(extend[['wall']][[id]]) != 0) {
#    file.create(paste0('db/walls/', id, '.txt'))
    out <- file(paste0('db/walls/', id, '.txt'), open = 'w')
    writeLines(as.vector(extend[['wall']][[id]]$comment), out)
    close(out)
  }
  # удаление данных стены
  extend[['wall']][[id]] <- ''
}

Created by Pretty R at inside-R.org


Объём выкачиваемых данных для максимально отфильтрованного набора в 3000 кандидаток составляет 2,2 Гб... на имеющемся железе даже минимальный парсинг является задачей на пределе ресурсов, ведётся доработка средств анализа.


Завершён курс Coursera Medical Neurosciense
evfratov
Дисклеймер: только личный опыт.


Завершено просматривание курсе медицинской нейробиологии https://class.coursera.org/medicalneuro-002
объём и содержание курса представляет собой "почувствуй себя студентом-медиком": 7 крупных частей и очень много десятков часов, на освоение ушло свыше полугода, не говоря о сложности для понимания. Не хочется рекомендовать принудительное изучение этого курса даже для тех, кто изучает нейробиологию по киберпанк-аниме, после чего пытаются разрабатывать технологии для загрузки сознания (хотя для таких нужен отдельный котёл в аду).

MFYD Krimea Crazy Journey
evfratov
region_1
region_2

Опубликована наша вторая статья
evfratov

Дисклеймер: здесь будет немного разобраны две статьи и на примере мини-дополнения продемонстрирован один из примеров каждодневной работы.

Совсем недавно была опубликована он-лайн наша вторая статья, совсем небольшая, биоинформатическая, являющаяся побочным продуктом выполнения дипломной работы. Хороший российский (!) журнал Acta Naturae, статья называенися "Structural Features of the Telomerase RNA Gene in the Naked Mole Rat Heterocephalus glaber", посвящена подробному рассмотрению теломеразной РНК голого землекопа, индексаторами ещё не была проиндексирована, потому пока не пабмедится.
Журнал лежит здесь http://actanaturae.ru/ , открытый.

Вполне в тему недавно была опубликована ещё одна статья по изучению долгоживующих грызунов, конечно не наша, по свой сути являющаяся обзором про рак и старение у голого землекопа (naked mole rat, NMR) и слепыша какого-то там (blind mole rat, BMR, котором - отдельная история).

При чём здесь мы: ген теломеразной РНК был хоть как-то описан для NMR в нашей статье, а ген BMR вообще никак и ни кем рассмотрен не был, а значит можно поискать и посмотреть. Для начала нам нужно узнать был-ли прочитан геном вообще, лезем для этого в http://www.ncbi.nlm.nih.gov/genome/ , ищем 'bllind mole rat' и ничего не находим, смотрим в статью на картинку и видим что там он назван 'Nannospalax ehrenbergi', ищем снова и видим:
"    No items found.
See also 1 organelle- and plasmid-only records matching your search"
ээ.. чо? вы охамели? Заявлено что геном есть, а в базе данных только митохондрия. Ладно, читаем статью нормально: ссылка 60, "Genome-wide adaptive complexes to underground stresses in blind mole rats Spalax. Nature Commun. 5, 3966 (2014)", находим статью, видим идентификатор сборки генома NCBI "DDBJ/GenBank/EMBL - AXCS00000000", лезем в NCBI nucleotide , находим запись о WGS-сборке AXCS - значит что-то есть, лезем в master-record , видим привычные 300 тысяч контигов (кусков генома), стандартно получаемых на рядовом проекте по секвенированию всего генома сразу для позвоночного, и ещё что покрытие 84 раза и что иллюмина. Скачиваем 6 кусков (видимо им дробить удобнее) в формате fasta со сжатием, распаковываем, склеиваем все 6 в один файл (cat AXCS01.* > /media/data/BMR-genome.fa), проверяем что нет склейки конца текущего контига с началом следующего (grep ">[ACTGN]" /media/data/BMR-genome.fa) и готово, можно работать с геномом (unix-way, да). Поскольку теломеразные РНК млекопитающих мало отличаются друг от друга - достаточно выловить новую в геноме за счёт большой похожести (гомологии, если не слишком строго оперировать с терминами) с другими генами теломеразных РНК (TERC), для этого можно взять уже применённые в нашей статеь для этого последовательности TERC человека, мыши, крысы, того-же NMR, шиншиллы, морской свинки. Поиск по гомологии в геномах выполняется с помощью программного инструмента BLAST , этакого геномного гугла, ради удобства и стабильности работаем локально (unix-way - же :-) ). Сначала специально отформатируем геном для бласта (formatdb -t 'bmr' -i BMR-genome.fa -p F -n 'bmr') программой для подготовки, после этого можно приступать к пристрелке - понять есть-ли вообще хоть что-то, на TERC похожее (вдруг потерялся кусок генома при сборке, 300 тыс. контигов это дофига, в первой сборке генома NMR нужный ген был вообще разорван между контигами и с потерянным фрагментом) и в каком куске сборки оно. Ищем в геноме TERC человека ("blastall -p blastn -d bmr -i ~/test.fa -e 0.005", -p программа поиска нуклеотидов среди нуклеотидов, -d это файл с геномом, -i файл с последовательностью запроса, -e величина порога отсечения по статистической значимости):
BLASTN 2.2.25 [Feb-01-2011]

Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
"Gapped BLAST and PSI-BLAST: a new generation of protein database search
programs",  Nucleic Acids Res. 25:3389-3402.

Query= human-terc
         (451 letters)

Database: bmr
           356,096 sequences; 2,913,431,996 total letters

Searching..................................................done



                                                                 Score    E
Sequences producing significant alignments:                      (bits) Value

gi|605842126|gb|AXCS01048914.1| Nannospalax galili contig48914, ...   186   7e-45
gi|605830219|gb|AXCS01054860.1| Nannospalax galili contig54860, ...   125   2e-26

>gi|605842126|gb|AXCS01048914.1| Nannospalax galili contig48914, whole
            genome shotgun sequence
          Length = 66412

 Score =  186 bits (94), Expect = 7e-45
 Identities = 220/258 (85%), Gaps = 8/258 (3%)
 Strand = Plus / Plus

                                                                      
Query: 70   ggcgccgtgcttttgctccccgcgcgctgtttttctcgctgactttcagcgggcggaaaa 129
            ||||||||||||||||||||||||||||||||||||||||| |||||||||||| ||||
Sbjct: 2271 ggcgccgtgcttttgctccccgcgcgctgtttttctcgctggctttcagcgggcagaaag 2330

                                                                      
Query: 130  gcctcggcctgccgccttccaccgttcattctagagcaaa-caaaaaatgtcagctgctg 188
            || ||||||| ||||| ||||||   |||||| ||||||| ||||||||| ||||||| |
Sbjct: 2331 gcgtcggcctaccgccgtccaccaggcattct-gagcaaatcaaaaaatgccagctgccg 2389

                                                                      
Query: 189  gcccgttcgcccctcccggggacctgcggcgggtcgcctgcccagcccccgaaccccgcc 248
            || ||  |||| ||||| ||| |||||||||     || |||  |||||||   ||||||
Sbjct: 2390 gcgcgcccgcctctcccagggccctgcggcg----tccggcc--gcccccgcgtcccgcc 2443

                                                                      
Query: 249  tggaggccgcggtcggcccggggcttctccggaggcacccactgccaccgcgaagagttg 308
            |||||||||||| ||||| ||||| ||||||||||  ||| ||||| |||||||||||||
Sbjct: 2444 tggaggccgcggccggcctggggcctctccggaggtgcccgctgccgccgcgaagagttg 2503

                            
Query: 309  ggctctgtcagccgcggg 326
            |||||||| |||||||||
Sbjct: 2504 ggctctgttagccgcggg 2521


>gi|605830219|gb|AXCS01054860.1| Nannospalax galili contig54860,
           whole genome shotgun sequence
          Length = 3541

 Score =  125 bits (63), Expect = 2e-26
 Identities = 78/83 (93%)
 Strand = Plus / Plus

                                                                     
Query: 70  ggcgccgtgcttttgctccccgcgcgctgtttttctcgctgactttcagcgggcggaaaa 129
           ||||||||||||||||||||||||||||||||||||||||| |||||||||||| |||||
Sbjct: 125 ggcgccgtgcttttgctccccgcgcgctgtttttctcgctggctttcagcgggcagaaaa 184

                                
Query: 130 gcctcggcctgccgccttccacc 152
           || ||||||| ||||| ||||||
Sbjct: 185 gcgtcggcctaccgccgtccacc 207


  Database: bmr
    Posted date:  Jul 19, 2014  4:47 PM
  Number of letters in database: 2,913,431,996
  Number of sequences in database:  356,096

Эммм... 2 части гена на геном, одна длинная, вторая короткая и начинаются одинакова, учитывая что это не повторяющиеся элементы.. Ладно, первый кусок почти полной длины, значит мы нашли что нужно, второй кусок, скорее всего, это ошибка сборки генома de novo и в игру "собери ген" играть не придётся.
Берём имя контига с большим куском (AXCS01048914.1) и вылавливаем его 10 строчным скриптом на perl, смотрим на то, где вообще ген лежит в контиге (2200 - 2550 нт), как он ориентирован (прямо, а не обратно) и после этого копипастим (ну или substring(start = 2200, end = 2550) ):

>gi|605842126|gb|AXCS01048914.1|
AACAGCGGTTGCAGGCGCATGGGCCGAGAGGCTGTGCCGCGGTTCCTCT
AACCCTAACCTATCTGGCTGTGGGCGCCGTGCTTTTGCTCCCCGCGCGCT
GTTTTTCTCGCTGGCTTTCAGCGGGCAGAAAGGCGTCGGCCTACCGCCG
TCCACCAGGCATTCTGAGCAAATCAAAAAATGCCAGCTGCCGGCGCGCCCG
CCTCTCCCAGGGCCCTGCGGCGTCCGGCCGCCCCCGCGTCCCGCCTGGA
GGCCGCGGCCGGCCTGGGGCCTCTCCGGAGGTGCCCGCTGCCGCCGCGA
AGAGTTGGGCTCTGTTAGCCGCGGGACCCGCGGGGGCTGCCGGCGAGTG
GCGGG

Вспоминаем про наши последовательности TERC человека, мыши, шиншиллы и морской свинки:
>human-terc
GGGTTGCGGAGGGTGGGCCTGGGAGGGGTGGTGGCCATTTTTTGTCTAACCCTAACTGAGAAGGGCGTAG
GCGCCGTGCTTTTGCTCCCCGCGCGCTGTTTTTCTCGCTGACTTTCAGCGGGCGGAAAAGCCTCGGCCTG
CCGCCTTCCACCGTTCATTCTAGAGCAAACAAAAAATGTCAGCTGCTGGCCCGTTCGCCCCTCCCGGGGA
CCTGCGGCGGGTCGCCTGCCCAGCCCCCGAACCCCGCCTGGAGGCCGCGGTCGGCCCGGGGCTTCTCCGG
AGGCACCCACTGCCACCGCGAAGAGTTGGGCTCTGTCAGCCGCGGGTCTCTCGGGGGCGAGGGCGAGGTT
CAGGCCTTTCAGGCCGCAGGAAGAGGAACGGAGCGAGTCCCCGCGCGCGGCGCGATTCCCTGAGCTGTGG
GACGTGCACCCAGGACTCGGCTCACACATGC
>guinea-terc
CCTGAGACTCAGTCTCGCGACAGCCGTGGCAGGCGTCAGCCAATCCGCGCGGGCGCCGACCACTGTTTTA
TAAGGAGCCTCTGCGAGCCGCTGGGCCGGGAGGGGTGGTGGTCTTCCCTGTCTAACCCTAAGGTGAAGAG
GACGTGGGTGCCGTGTTTTTCGCTCCCGCACGCTGTTTTTCTCGCTGACTTTCAGCGTGCAGAAAAGCCT
TGGCCTACCGTCGGTTATTGTCTAATTAGAAGCAAACAAAAAATGTCAGCGTGGCCGGGCCGCCCCTCCC
GGATACCTGCGGCGGCTCGTCCACCGGCCCCCGAGCCCCGCCTAGGCCGCGGCCGGCGCGGGGCTTCCCT
GGAGGCGCCCATGGCCGCCGCGAAGAGTTCGTCTCTGTCAGCTGCGGGTCGCCCGGGGGCCGCGGGAGAG
TCCCAGGCCTTGGCCGCAGGGAGAGAAACGGAGCAGGTCCTCGCGCGGTGCACTCCCCTGAGCTGTGGGA
AGTGCACCGGGACGGGCTCCTACAAGC
>chinchilla-terc
CGTGAGACCAAGTGTCGCGAGAGCCGTGGCAAGGCTTCAGCCAATCCGAGCGGGCGCCTCCTGCCCTCTT
TATAAGGAGCCTCTGCGCACACGTCCGCGGGTTGAGAATGGTGGGCCGGGAGGGGAGGTGGGCATGTTTT
GTCTAACCCTAACTAGGAGGAGGACGTAGGCGCCGTGCTTTTGTTCCCCGCGCGCTGTTTTTCTCGCTGA
CTTTCAGCGTGCGGAAAAGCCTTGGCCTGCCGTCGACCACTGTCTAATTAAAAGCAAACAAAAAATGTCA
GCGTGGCCGGTCCGCCCCTCCCGGGTACCTGCGGCAGCTCGCCCGGCTGGCCCCCGAGCCCCGCCCAGGG
CCACGGCTGGCGCGGGGCTTCTCCGGGAGCGCCATGGCCGCCGCGAAGAGTTCGTCTCTGTCAGCCGCGG
GTCGCGCGGGGGCCGCGGGGGAGTCCTAGGCCGAGTGGCCGCAGGAAGAGAAACGGAGCCTGTCCCTGTG
CACGGGGCGCTTCTCTGAGCTGTGGGAAGTGCCCCGAGACTCGGCTCCTACAAGC
>mouse-terc
ACCTAACCCTGATTTTCATTAGCTGTGGGTTCTGGTCTTTTGTTCTCCGCCCGCTGTTTTTCTCGCTGAC
TTCCAGCGGGCCAGGAAAGTCCAGACCTGCAGCGGGCCACCGCGCGTTCCCGAGCCTCAAAAACAAACGT
CAGCGCAGGAGCTCCAGGTTCGCCGGGAGCTCCGCGGCGCCGGGCCGCCCAGTCCCGTACCCGCCTACAG
GCCGCGGCCGGCCTGGGGTCTTAGGACTCCGCTGCCGCCGCGAAGAGCTCGCCTCTGTCAGCCGCGGGGC
GCCGGGGGCTGGGGCCAGGCCGGGCGAGCGCCGCGAGGACAGGAATGGAACTGGTCCCCGTGTTCGGTGT
CTTACCTGAGCTGTGGGAAGTGCACCCGGAACTCGGTTCTCACAACC

Засовываем это всё во множественный FASTA-файл и выравниваем с помощью программы ClustalW за счёт оболочки ClustalX - делаем множественное выравниване последовательностей. Получаем какое-то прикидочное выравнивание, видим что мыша там лишняя и что мы плохо отрезали ген по краям из контига. Поправляем, выкидываем мышь, выравниваем и получаем это:

bmr-align
Начало РНК весьма вариативно, потому без эксперимента при большой разнице в последовательности нельзя сказать где точно старт транскрипции, на нём нект особого акцента. В общем видно что ген не имеет примечательных отличий (кроме небольшой делеции на третьей сотне, которая и так не консервативна), похож на среднее между шиншиллой, морской свинкой и человеком.
На этом закончим, потому что мне совсем не охота сравнивать ген с кучей других TERC в поисках уникальных и неуникальных вариантов последовательности, оценивать вторичную структуру и рассматривать промотерную область.

Поправка реализации широкоформатного скрининга
evfratov
Дисклеймер - это только соображения о возможных поправках в технической стороне WSS.

Обязательная и трудозатратная ручная инспекция страниц vk потребляет много времени и отсеивает бОльшую часть кандидаток, но в этом присутствует изрядный субъективизм и применить это допустимо только не более чем к сотне-двум страницам. Изначально WSS предполагался как автоматизация минимизации выборки для ручной инспекции с последующим общением, при этом критерии формирования первичной выборки предполагались не особо строгими и простыми. Обозревательный анализ данных показал что это будет работать с посредственной эффективностью, поскольку многие указывают данные очень неполно, потому выборка получилась большой (3 тыс. чел.) из-за жертвования селективностью ради чувствительности. Формально говоря, задача отбора является задачей классификации (на две категории или несколько, если есть дифференциация по рейтингу) и здесь хорошо подошло-бы machine learning, например SVM, но отсутствовала обучающая выборка (потому что обучающая выборка из положительных примеров и была-бы целевым списком кандидаток, который и ставится цель сформировать).

Ручная инспекция, теоретически, может сработать как обучающая выборка, поскольку там есть как положительные, так и отрицательные (в большинстве) примеры, но это требует значительного расширения способов анализа данных учётной записи - терминологический анализ списков групп (как по участию, так и по отметкам), ключевые слова, число и содержание сообщений от пользователя в группе, обсуждения фотографий пользователя...

Но реализация такого анализа столь неструктурированных данных является очень сложной задачей с длительной экспериментальной отработкой каждого шага, требует существенного улучшения навыков social network data mining и растянется на много месяцев, за которые можно быстрее закончить всё вручную.

WSS - Code Update и немного статистики
evfratov
Дисклемер: описание апдейта кода инструмента широкоформатного скрининга и основная статистическая информация


### ### Статистический анализ
nrow(selected) # сколько всего
sum(selected$country == 0) - очень низкоприротетно, бинарный есть - нет
sum(selected$university_name == 0) - низкоприротетно, бинарный есть - нет
sum(selected$bdate == 0) - средний критерий приоритета, бинарный нет - есть
sum(selected$city == 0) - важный критерий наличия и очень важдый критерий по COI (города интереса), тринарный нет - есть - COI
table(selected$relation) - главный критерий приоритета, бинарный 0|1 - 5|6
### категоризация
# итого: university_name bdate city+city_u_COI relation
# вычисление рейтинга:
# country 1
# university_name 2
# bdate 2
# city 2
# city_u_COI 10
# relation 20
# задание Городов Интереса
coi <- c('Москва', 'Санкт-Петербург', 'Нижний Новгород', 'Ижевск', 'Тольятти', 'Сарапул', 'Казань', 'Киров', 'Арзамас')
# новая колонка для рейтинга
score <- rep(0, nrow(selected))
selected <- cbind(selected, score)
# оценка
for (i in 1:nrow(selected)) {
tmp <- selected[i,]
# учёт country
if (tmp$city != 0) { selected[i,'score'] <- selected[i,'score'] + 1 }
# учёт university_name
if (tmp$university_name != 0) { selected[i,'score'] <- selected[i,'score'] + 2 }
# учёт bdate
if (tmp$bdate != 0) { selected[i,'score'] <- selected[i,'score'] + 2 }
# учёт city
if (tmp$city != 0) { selected[i,'score'] <- selected[i,'score'] + 2 }
# учёт city_u_COI
if (tmp$city %in% coi) { selected[i,'score'] <- selected[i,'score'] + 10 }
# учёт relation
if (tmp$relation > 1) { selected[i,'score'] <- selected[i,'score'] + 20 }
}
# exploratory plot
plot(table(selected$score))





scoring

# разбивка на 3 приоритета до 8, после 8 и до 20, с 20
minim <- 8
maxim <- 20
abline(v = minim, col = 'blue', lwd = 2)
abline(v = maxim, col = 'red', lwd = 2)
priority <- list()
priority[['low']] <- selected[selected$score < minim,]
priority[['mid']] <- selected[(selected$score >= minim) & (selected$score < maxim),]
priority[['high']] <- selected[selected$score >= maxim,]
# итоговая статистика
sapply(priority, nrow)

# вывод приоритетных данных
for (name in names(priority)) {
filename <- paste0('PriorityList_', name, '.tab')
write.table(priority[[name]], filename, sep = "\t", quote = F, row.names = F, col.names = T)
}

Created by Pretty R at inside-R.org

При этом:
10% не указали страну
80% не указали имя ВУЗа
80% без даты рождения
20% не указали город
90% не указали статус, а не single всего у 1,35%

По описанной в коде система вычисления рейтинга в суммы факторов с разным весом (основной вклад - статус отношений в анкете и принадлежность к городам интереса) разбивается на 3 категории: low - 2131, mid - 951, high - 45. Главный фактор принадлежности к категории high является заявленный статус отношений "it's complicated/actively searching", а главный фактор принадлежности к категории mid это наличие города в списке городов интереса, более точно значение score уже определяется полнотой информации в анкете.

Фильтрация ручным просмотре страниц очень трудозатратна, потому применима лишь к списку высокого приоритета, разбор отсёк 30 человек и показал что обязателен второй этап автоматизированного анализа, поскольку оказалось что число групп иногда достигает астрономических значений (что понижает значимость принадлежности к ТГ-релевантным группам) и иногда вовсе бывает скрыто, хотя методами API Vk можно получить к этому доступ. Также автоматизированный расширенный анализ позволит эффективнее просматривать и сортировать анкетные данные.