比较两个用户定义的曲线并评分它们的相似性

时间:2011-08-19 18:56:22

标签: r geometry computational-geometry curve

我有一组2条曲线(每条曲线有几百到几千个数据点),我想要比较并得到一些相似性“得分”。实际上,我有100个这样的套装要比较......我熟悉R(或至少是bioconductor)并且想要使用它。

我尝试了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条曲线下的面积并减去它。我看一下帖子“R中2条曲线下的阴影区域”,但这不是我需要的。

第二个问题(可选)是对于具有相同轮廓但幅度不同的线,我想将它们评为非常相似,即使它们下面的区域很大:

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 ??

我希望假装向程序员提出问题的生物学家可以......

如果需要,我很乐意提供一些真实的例子。

提前致谢!

3 个答案:

答案 0 :(得分:2)

它们不会形成成对x.y值的通常含义的曲线,除非它们的长度相等。前三个长度相等,在矩阵中打包后,HMisc包中的rcorr函数返回:

> 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

答案 1 :(得分:0)

我没有很好的答案,但过去我确实遇到过类似的问题,可能不止一次。我的方法是回答自己,当我主观评估它们时,我的曲线是什么样的(这里的科学术语是“眼球”:)。它是曲线下的区域吗?我是否将曲线的线性平移,旋转或缩放(缩放)计算为不相似?如果没有,我会通过选择的归一化来取出我不关心的所有因素(例如,将曲线缩放以覆盖x和y中的相同范围)。

我相信这个主题有一个严谨的数学理论,我会搜索“亲和力”“仿射”这两个词。也就是说,我原始/天真的方法通常足以完成我正在做的工作。

您可能想在某个数学论坛上提出这个问题。

答案 2 :(得分:0)

如果您比较的蛋白质是相当接近的直系同源物,那么您应该能够获得想要对其进行相似性评分的每一对的比对,或者整个组的多重比对。根据应用,我认为后者将更加严谨。然后,我将仅提取对齐的那些氨基酸的折叠分数,使得所有分布具有相同的长度,并计算相关性度量或平方的归一化点积的平方作为相似性度量。平方归一化点积或spearman等级相关性对幅度差异不太敏感,这似乎是你想要的。这将确保您比较合理配对的元素(在比对合理的范围内),并让您回答如下问题:“比较蛋白质中的相应残基是否通常折叠到相似程度?”。