Сравните две пользовательские кривые и оцените их сходство - PullRequest
3 голосов
/ 19 августа 2011

У меня есть набор из 2 кривых (каждая с точками данных от нескольких сотен до пары тысяч), которые я хочу сравнить и получить «оценку» сходства.На самом деле, у меня есть> 100 из этих наборов для сравнения ... Я знаком с R (или, по крайней мере, биокондуктором) и хотел бы использовать его.

Я пробовал функцию ccf(), но я неслишком рад этому.

Например, если я сравниваю c1 со следующими кривыми:

c1 <- c(0, 0.8, 0.9, 0.9, 0.5, 0.1, 0.5)

c1b <- c(0, 0.8, 0.9, 0.9, 0.5, 0.1, 0.5) # perfect match! ideally score of 1

c1c <- c(1, 0.2, 0.1, 0.1, 0.5, 0.9, 0.5) # total opposite, ideally score of -1? (what would 0 be though?)

c2 <- c(0, 0.9, 0.9, 0.9, 0, 0.3, 0.3, 0.9) #pretty good, score of ???

Обратите внимание, что векторы не имеют одинаковый размер, и его необходимо нормализовать,как-то ... Есть идеи?Если вы посмотрите на эти 2 линии, они довольно похожи, и я думаю, что на первом этапе можно измерить площадь под 2 кривыми и вычесть.Я смотрю на пост «Затененная область под 2 кривыми в R», но это не совсем то, что мне нужно.

Второй вопрос (необязательный) заключается в том, что для линий, имеющих одинаковый профиль, но разную амплитуду, я быхотелось бы, чтобы они были очень похожими, хотя область под ними была бы большой:

c1 <- c(0, 0.8, 0.9, 0.9, 0.5, 0.1, 0.5)

c4 <- c(0, 0.6, 0.7, 0.7, 0.3, 0.1, 0.3) # very good, score of ??

Я надеюсь, что биолог, претендующий на постановку задачи программисту, в порядке ...

I 'Буду рад предоставить некоторые примеры из реальной жизни, если это необходимо.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

Они не образуют кривые в обычном значении парных значений xy, если они не имеют одинаковую длину.Первые три имеют одинаковую длину и после упаковки в матрицу функция rcorr в пакете HMisc возвращает:

> rcorr(as.matrix(dfrm))[[1]]
    c1 c1b c1c
c1   1   1  -1
c1b  1   1  -1
c1c -1  -1   1   # as desired if you scaled them to 0-1

Соотношение векторов c1 и c4:

> cor( c(0, 0.8, 0.9, 0.9, 0.5, 0.1, 0.5),
  c(0, 0.6, 0.7, 0.7, 0.3, 0.1, 0.3) )
[1] 0.9874975
0 голосов
/ 22 августа 2011

Если сравниваемые вами белки являются достаточно близкими ортологами, вы сможете получить выравнивание для каждой пары, для которой вы хотите получить сходство, или множественное выравнивание для всей группы.В зависимости от приложения, я думаю, что последний будет более строгим.Затем я извлек бы оценку складывания только тех аминокислот, которые выровнены так, чтобы все профили имели одинаковую длину, и вычислил бы показатели корреляции или возведенные в квадрат нормализованные точечные продукты профилей в качестве меры сходства.Квадрат нормализованного точечного произведения или корреляция ранга копейщика будут менее чувствительны к разнице амплитуд, которая, как вам кажется, вам нужна.Это убедится, что вы сравниваете элементы, которые являются разумно спаренными (в той степени, в которой выравнивание является разумным), и позволит вам ответить на такие вопросы, как: «Соответствующие остатки в сравниваемых белках обычно свернуты в одинаковой степени?»

0 голосов
/ 19 августа 2011

У меня нет очень хорошего ответа, но я сталкивался с подобным вопросом в прошлом, вероятно, более чем в 1 случае.Мой подход заключается в том, чтобы ответить самому себе, что делает мои кривые похожими, когда я субъективно оцениваю их (научный термин здесь «сногсшибательный» :).Это площадь под кривой?Считаю ли я линейный сдвиг, вращение или масштабирование (увеличение) моих кривых как вклад в различие?Если нет, я убираю все факторы, которые меня не волнуют, путем выбранной нормализации (например, масштабирую кривые, чтобы охватить одинаковые диапазоны по x и y).

Я уверен, что существует строгая математическая теорияпо этой теме я бы искал слова "аффинность", "аффинность".Тем не менее, моих примитивных / наивных методов обычно было достаточно для работы, которую я выполнял.

Вы можете задать этот вопрос на математическом форуме.

...