6

我有一个矩阵,条目都是概率。大多数条目的概率非常低。有些是零。我需要做矩阵的日志。但是,由于矩阵中有零,R 为那些零条目生成 -inf。我的目标是将此日志(矩阵)输入 image.plot()。当我将其输入 image.plot 时,我不断收到此错误:

Error in seq.default(minz + binwidth/2, maxz - binwidth/2, by = binwidth) : 
  invalid (to - from)/by in seq(.)

这里有什么解决方案可以帮助我解决这个问题吗?

这是矩阵的样子:

                  0          1          2          3         4         5         6
 [1,] -0.0007854138 -8.9132811 -10.011893 -10.705041 -9.606428 -9.318746      -Inf
 [2,] -0.3402118357 -1.6137090  -2.742625  -4.215836 -5.721434 -7.121522 -9.606428
 [3,] -0.2912175507 -2.0296478  -3.521929  -4.275321 -4.426519 -4.187369 -3.715705
 [4,] -1.5244380532 -0.7048802  -2.001368  -3.405243 -3.713864 -3.143919 -3.781412
 [5,] -0.7572491288 -0.7487709  -3.981208  -5.110329 -5.228577 -5.095569 -5.293395
 [6,] -0.0007629648       -Inf  -8.759130  -7.613998 -9.606428      -Inf      -Inf
 [7,] -0.0020658381 -7.4861648  -7.526987  -7.094123 -9.318746      -Inf      -Inf
 [8,] -0.0295715883 -6.7160566  -7.208533  -6.610696 -6.485533 -6.813220 -6.387552
 [9,] -0.0032128722 -6.7160566  -7.613998  -7.871827 -7.760602 -8.759130 -8.759130
[10,] -0.4869248130 -1.3225132  -2.518576  -3.768698 -5.140520 -6.183252 -7.208533
               7          8          9
 [1,]       -Inf -10.705041 -10.011893
 [2,]       -Inf       -Inf  -7.149693
 [3,]  -4.965248  -5.968842  -6.428374
 [4,]  -4.696227  -5.091913  -4.669559
 [5,]  -5.163777  -5.468599  -6.577906
 [6,]       -Inf       -Inf       -Inf
 [7,]       -Inf       -Inf       -Inf
 [8,]  -6.627503  -6.456545  -6.400976
 [9,] -10.011893 -10.011893       -Inf
[10,]  -8.402456  -7.814669  -6.546158

这是结构:

structure(c(0.999214894571557, 0.71161956034096, 0.747353073126963, 
0.217743382682817, 0.468954688200987, 0.999237326155227, 0.997936294302378, 
0.970861372812921, 0.996792283535218, 0.614513234634365, 0.000134589502018843, 
0.199147599820547, 0.13138178555406, 0.49416778824585, 0.472947510094213, 
0, 0.000560789591745177, 0.00121130551816958, 0.00121130551816958, 
0.266464782413638, 4.48631673396142e-05, 0.0644010767160162, 
0.0295423956931359, 0.135150291610588, 0.0186630776132795, 0.00015702108568865, 
0.00053835800807537, 0.000740242261103634, 0.000493494840735756, 
0.0805742485419471, 2.24315836698071e-05, 0.0147599820547331, 
0.0139075818752804, 0.0331987438313145, 0.00603409600717811, 
0.000493494840735756, 0.000829968595782862, 0.00134589502018843, 
0.000381336922386721, 0.0230820995962315, 6.72947510094213e-05, 
0.00327501121579183, 0.0119560340960072, 0.0243831314490803, 
0.00536114849708389, 6.72947510094213e-05, 8.97263346792284e-05, 
0.00152534768954688, 0.000426200089726335, 0.00585464333781965, 
8.97263346792284e-05, 0.000807537012113055, 0.0151861821444594, 
0.0431135038133692, 0.00612382234185734, 0, 0, 0.00109914759982055, 
0.00015702108568865, 0.00206370569762225, 0, 6.72947510094213e-05, 
0.0243382682817407, 0.022790489008524, 0.00502467474203679, 0, 
0, 0.00168236877523553, 0.00015702108568865, 0.000740242261103634, 
0, 0, 0.00697622252131, 0.00912965455361149, 0.00572005383580081, 
0, 0, 0.00132346343651862, 4.48631673396142e-05, 0.000224315836698071, 
2.24315836698071e-05, 0, 0.00255720053835801, 0.00614625392552714, 
0.00421713772992373, 0, 0, 0.0015702108568865, 4.48631673396142e-05, 
0.000403768506056528, 4.48631673396142e-05, 0.000785105428443248, 
0.00161507402422611, 0.00937640197397936, 0.00139075818752804, 
0, 0, 0.00165993719156572, 0, 0.00143562135486765), .Dim = c(10L, 
10L), .Dimnames = list(NULL, c("0", "1", "2", "3", "4", "5", 
"6", "7", "8", "9")))
4

5 回答 5

4

如果这些零点是由应该产生肯定结果但由于技术原因未能这样做的物理测量引起的,则用 1/2 的检测下限代替零点可能是合理的。

 M2 <- M
 print( min(M[M!=0]), digits=16)
#[1] 2.24315836698071e-05
 M2[M2==0] <- 0.5*min(M[M!=0])
 image(M2)
 image(log(M2))

在此处输入图像描述

于 2013-08-21T01:11:19.023 回答
2

except 被抛出seq(),它不能-inf作为它的任何一个参数。您可以使用以下代码获得完全相同类型的错误:

> seq(-log(0), 0, 50)
Error in seq.default(-log(0), 0, 50) : invalid (to - from)/by in seq(.)

为避免这种情况,请遵循 @Metrics 的技巧。尽管我建议不要添加 1.0,而是添加一个非常小的值,例如 1e-22,因为您的矩阵是概率矩阵。

于 2013-08-21T00:32:56.120 回答
2

诚然,对数图可能会使“条目之间的差异更加明显”。但是,如果您的数据中有零,那么您将错误地使用它。对数刻度的目的是说明数据的指数增长。然而,有零意味着:

  • 观察到的值不是由表现出指数增长的过程产生的,或者
  • 你需要以不同的方式处理你的缺失值。

无论哪种方式,在您的情况下效果更好的是取values 的平方根。或者(n>2)-th 根,如果您想进一步强调值的差异 - n越高,差异越大。

根据下面@flodel 的建议,执行此操作的代码是:image.plot(sqrt(x))或者,更一般地说,image.plot(x^(1/n))对于一些n>1.

希望这可以帮助。

于 2013-08-21T00:43:51.493 回答
2

一个简单的技巧是添加 1,因为 log1=0 使得具有 0 的单元格在对数转换后仍然具有 0。

  k<-matrix(c(1:8,0,0),nrow=2,ncol=5)

> k
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    0
[2,]    2    4    6    8    0
log(k)
          [,1]     [,2]     [,3]     [,4] [,5]
[1,] 0.0000000 1.098612 1.609438 1.945910 -Inf
[2,] 0.6931472 1.386294 1.791759 2.079442 -Inf

log(k+1)
          [,1]     [,2]     [,3]     [,4] [,5]
[1,] 0.6931472 1.386294 1.791759 2.079442    0
[2,] 1.0986123 1.609438 1.945910 2.197225    0
于 2013-08-21T00:02:13.760 回答
0

不能在评论中粘贴多行代码,但这个例子说明了我的意思:

> m=cbind(c(0,0.88,0.99),c(1,2,1),c(3,4,5))
> m=as.matrix(m)
> log(m)
            [,1]      [,2]     [,3]
[1,]        -Inf 0.0000000 1.098612
[2,] -0.12783337 0.6931472 1.386294
[3,] -0.01005034 0.0000000 1.609438
> m
     [,1] [,2] [,3]
[1,] 0.00    1    3
[2,] 0.88    2    4
[3,] 0.99    1    5
于 2013-08-20T23:59:15.677 回答