Построение тепловой карты плотности вероятности с течением времени в R

Скажем, у меня есть результат моделирования Монте-Карло одной переменной за несколько разных итераций (думаю, миллионы). Для каждой итерации у меня есть значения переменной в каждый момент времени (от t = 1 до t = 365).

Я хотел бы создать следующий график: для каждого момента времени t по оси x и для каждого возможного значения «y» в заданном диапазоне установите цвет x, y на «k», где «k» - подсчет количества наблюдений в непосредственной близости от расстояния "d" до x, y.

Я знаю, что вы можете легко сделать тепловые карты плотности для одномерных данных, но есть ли хороший пакет для этого в двух измерениях? Обязательно ли использовать кригинг?

Изменить: структура данных в настоящее время представляет собой матрицу.

                                     data matrix

                                      day number
             [,1]    [,2]         [,3]      [,4]       [,5]      ... [,365]
iteration    [1,]    0.000213   0.001218    0.000151   0.000108  ... 0.000101
             [2,]    0.000314   0.000281    0.000117   0.000103  ... 0.000305
             [3,]    0.000314   0.000281    0.000117   0.000103  ... 0.000305
             [4,]    0.000171   0.000155    0.000141   0.000219  ... 0.000201
              .
              .
              .
     [100000000,]    0.000141   0.000148    0.000144   0.000226  ... 0.000188

Я хочу, чтобы для каждого «дня» пиксели, проходящие вертикально через этот «день», представляли плотность вероятности значений итерации для этого дня в цвете. Результат должен выглядеть как тепловая карта.


person Alfalfa    schedule 13.06.2015    source источник
comment
Попробуйте функцию image или _2 _ / _ 3_ в ggplot2.   -  person shadowtalker    schedule 13.06.2015
comment
@ssdecontrol, если бы я использовал функцию изображения, как мне обработать координаты x, y, для которых у меня нет данных? Придется ли мне самому строить матрицу x, y для графика путем интерполяции? Я надеялся, что что-то готово для этого ...   -  person Alfalfa    schedule 13.06.2015
comment
@Alfalfa недостающие данные - это отсутствующие данные в любом контексте. Если у вас есть дыры в матрице, вам нужно с ними справиться. Если вы имеете в виду, что ваша ось x должна быть чем-то другим, кроме 1, 2, 3, 4, вы можете просто построить ось самостоятельно.   -  person shadowtalker    schedule 13.06.2015
comment
@Alfalfa здесь также есть несколько примеров здесь < / а>   -  person shadowtalker    schedule 13.06.2015
comment
@ssdecontrol Кажется, что hexbinplot идеально подходит для того, что я хотел бы сделать. Большое спасибо!   -  person Alfalfa    schedule 14.06.2015


Ответы (1)


Вот одно из решений того, что, я думаю, вам нужно.

  1. Сгенерируйте данные.

    myData <- mapply(rnorm, 1000, 200, mean=seq(-50,50,0.5))

Это матрица с 1000 строками (наблюдениями) и 201 моментом времени. В каждой временной точке среднее значение данных постепенно смещается от -50 до 50. Каждый раз на 0,5.

  1. Получите плотности.

    myDensities <- apply(myData, 2, density, from=-500, to=500)

Это даст вам список плотностей для каждого столбца. Чтобы их можно было построить рядом, мы указали диапазоны (от -500 до 500) вручную.

  1. Получите значения плотности из списка.

    Ys <- sapply(myDensities, "[", "y")

Это снова список. Из этого вам нужно получить матрицу.

  1. Получить матрицу из списка.

    img <- do.call(cbind, Ys)

Это просто объединяет все Ys элементов по столбцам.

  1. Участок.

    filled.contour(x=1:ncol(img), y=myDensities[[1]]$x, t(img))

Для этого я использую fill.contour. Но вы можете поискать другие функции 2D-графика. Я также использовал значения, полученные из плотностей D[[1]]$x.

И вот результат:

плотности

Виден сдвиг от -50 до 50.

Не уверен, что это может работать с миллионами временных точек. Но рисовать миллион, вероятно, не имеет смысла, поскольку вы в любом случае будете ограничены количеством пикселей. Может потребоваться некоторая предварительная обработка.

person Karolis Koncevičius    schedule 13.06.2015
comment
К счастью, у меня не миллионы временных точек, а просто миллионы наблюдений за каждый момент времени. Так что это будет работать отлично. Я попробую это вместе с hexbinplot, предложенным в комментариях. Спасибо! - person Alfalfa; 14.06.2015
comment
Каждый раз, когда заполнено. Контур является ответом, тогда lattice::levelplot также является вариантом. - person IRTFM; 14.06.2015