2015-06-13 4 views
4

Предположим, что у меня есть результат моделирования monte-carlo одной переменной в течение нескольких разных итераций (думаю, миллионы). Для каждой итерации у меня есть значения переменной в каждый момент времени (от t = 1 до t = 365).Графическая диаграмма плотности вероятности плотностей со временем в R

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

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

Редактировать: Структура данных в настоящее время является матрицей.

         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 

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

+0

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

+0

Попробуйте функцию 'image', или' geom_tile'/'geom_raster' в ggplot2. – shadowtalker

+0

@josilber Я обновил вопрос с примерами данных. – Alfalfa

ответ

3

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

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

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

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

densities

Переход от -50 до 50 видна.

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

+1

К счастью, у меня нет миллионов точек времени, а всего лишь миллионы наблюдений за точку времени. Так что это будет работать отлично. Я попробую это вместе с hexbinplot, предложенным в комментариях. Благодаря! – Alfalfa

+1

Любое время fill.contour - это ответ, тогда 'решетка :: levelplot' также является опцией. –

+0

Что такое «тест» и как я могу его сгенерировать? Благодаря! – Rotail

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