2013-08-20 2 views
6

У меня есть матрица, и все записи являются вероятностями. Большинство записей имеют очень низкую вероятность. У некоторых есть нули. Мне нужно сделать журнал матрицы. Однако, поскольку в матрице есть нули, R генерирует -inf для этих нулевых записей. Моя цель - передать этот журнал (матрицу) в image.plot(). Когда я кормлю это в image.plot, я постоянно получаю эту ошибку:Как бороться с журналом нуля в R в 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"))) 
+1

Какое сообщение об ошибке вы получаете? Я думаю, что 'log()' в R должен возвращать '-inf' за 0.0 –

+1

Важным вопросом является то, почему вы берете журнал? – Dason

+0

Потому что я на самом деле работаю с очень большой матрицей, но большинство записей имеют очень низкие значения. Если я просто загружаю эту матрицу в image.plot, она неэффективна. Взятие журнала может сделать разницу между элементами более заметными – mynameisJEFF

ответ

2

Правда, лог-график может сделать «разницу между элементами более заметными». Однако, если у вас есть нули в ваших данных, вы будете использовать их неправильно. Точка логарифмической шкалы - это иллюстрация экспоненциального увеличения данных. Имея нули, однако, означает, что либо:

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

В любом случае, что будет работать намного лучше в вашем случае принимает квадратный корень из значений. Или (n> 2) -й корень, если вы хотите еще больше подчеркнуть разницу в значениях - чем выше значение n, тем больше разница.

В соответствии с предложением ниже, приведенным ниже, код, который будет делать это: image.plot(sqrt(x)) или, в более общем плане, image.plot(x^(1/n)) для некоторых n>1.

Надеюсь, это поможет.

+0

намного лучше! Стоит упомянуть, что R-код будет «image.plot (x^(1/n))' для некоторого 'n> 1'. – flodel

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 
+1

Возможно, что исключение не было выбрано 'log()', а по тому, что вы делаете дальше, например 'image.plot()' –

2

Простой трюк состоит в том, чтобы добавить 1, поскольку log1 = 0, так что ячейка с 0 все еще будет иметь 0 после преобразования log п.

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 
+0

Учитывая структуру ввода OP, что-то вроде 'image. plot (log (1 + 10000 * x)) 'дает более приятную картинку, но удачи в интерпретации результатов ... У меня есть +1. – flodel

+0

Спасибо за ввод. – Metrics

+0

log (x + 1) не будет подчеркивать разницу между значениями OPs. log (10000x + 1) работает значительно лучше, но по-прежнему не является масштабно-инвариантным и может не работать, если различия между значениями намного меньше, чем 1/10000. – ktdrv

2

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

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

Чтобы избежать этого, следуйте трюк @Metrics «ы. Хотя я предлагаю вместо добавления 1.0 добавить очень маленькое значение, например 1е-22, так как ваша матрица является матрицей вероятностей.

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

enter image description here

Смежные вопросы