寻找"局部最大值"但忽略低于最高值的20%的值

时间:2014-04-08 10:26:24

标签: r

我正在尝试创建一个函数来在我的数据的每一行中找到“局部最大值”,但忽略它们是否至少不是连续“最高”最大值的20%。

我用来查找局部最大值的函数:

which(diff(sign(diff(Gene name)))==-2)+1

但我想修改它并仅在其他最大值至少为最高值的20%时设置选择。

这是我的数据:

Name     Mo   Tue   Wen   Thu   Fr   Sat   Sun   
Mark     0     32    53    11    0    33    52   
Ettin    22    51    31    0     0    1      0
Gerard   36    0     13    0    111   33     0   
Marcus   0     44    31    10    0    2      0     

这是我用我的功能得到的输出:

Name     Mo   Tue   Wen   Thu   Fr   Sat   Sun   
Mark     0     0     1     0     0    0     1   ## Two local maximas
Ettin    0     1     0     0     0    1     0   ## Two local maximas (Should be one!)
Gerard   1     0     1     0     1    0     0   ## Three local maximas (Should be two!)
Marcus   0     1     0     0     0    1     0   ## Two local maximas (Should be one!)

对于3行,输出不正确,因为单元格中的值(Ettin,Sat)& (Gerard,Wen)& (马库斯,周六)甚至没有接近至少20%的最高值。

这是我期望通过新功能得到的:

Name     Mo   Tue   Wen   Thu   Fr   Sat   Sun   
Mark     0     0     1     0     0    0     1   
Ettin    0     1     0     0     0    0     0   
Gerard   1     0     0     0     1    0     0   
Marcus   0     1     0     0     0    0     0  

是否可以编写这样的功能?

    if(master[j,i]>master[j,i-1]) {
      if(master[j,i] > 0.2*max(master [j,])) {
        mas_max[j,i] <- 1 ## Setting maxima
        mas_max[j,i-1] <- 0 ## Removing potential maxima before
 }
}

这是我创建的一个循环,但它不是获得所需结果的最佳方式。

1 个答案:

答案 0 :(得分:5)

如果您的本地最大值位于

ind <- which(diff(sign(diff(GeneName)))==-2)+1

然后你可以得到不低于最高值的20%的阈值指数

ind[GeneName[ind] >= 0.2 * max(GeneName[ind])]

另外,请注意==-2不会发现属于高原的局部最大值,例如它不会发现c(0,10,10,0) - 不确定这是否是一个问题,但最好指出这一点。