在 R 中随时间绘制概率密度热图
Plotting Probability Density Heatmap Over Time in R
假设我有一个变量在几次不同迭代(想想数百万次)后的蒙特卡洛模拟输出。对于每次迭代,我都有每个时间点的变量值(从 t=1 到 t=365)。
我想制作以下情节:
对于 x 轴上的每个时间点 t 和给定范围内的每个可能值 "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
我想,对于每个 "day" 像素 运行 垂直穿过 "day" 以颜色表示当天迭代值的概率密度。结果应该看起来像热图。
这是我认为您所追求的一种解决方案。
生成数据。
myData <- mapply(rnorm, 1000, 200, mean=seq(-50,50,0.5))
这是一个包含 1000 行(观察值)和 201 个时间点的矩阵。在每个时间点,数据的平均值从 -50 逐渐变化到 50。每次变化 0.5。
获取密度。
myDensities <- apply(myData, 2, density, from=-500, to=500)
这将为您提供每列的密度列表。为了让它们可以并排绘制,我们手动指定了范围(从 -500 到 500)。
从列表中获取密度值。
Ys <- sapply(myDensities, "[", "y")
这又是一个列表。你需要从中得到一个矩阵。
从列表中获取矩阵。
img <- do.call(cbind, Ys)
这只是按列组合了所有 Ys
个元素。
情节。
filled.contour(x=1:ncol(img), y=myDensities[[1]]$x, t(img))
我为此使用 filled.contour。但您可以四处寻找其他二维绘图函数。我还使用了从密度 D[[1]]$x
.
获得的值
结果如下:
可见从 -50 到 50 的变化。
不确定这是否适用于数百万个时间点。但是绘制百万可能没有什么意义,因为在任何情况下你都会受到像素数量的限制。可能需要某种预处理。
假设我有一个变量在几次不同迭代(想想数百万次)后的蒙特卡洛模拟输出。对于每次迭代,我都有每个时间点的变量值(从 t=1 到 t=365)。
我想制作以下情节: 对于 x 轴上的每个时间点 t 和给定范围内的每个可能值 "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
我想,对于每个 "day" 像素 运行 垂直穿过 "day" 以颜色表示当天迭代值的概率密度。结果应该看起来像热图。
这是我认为您所追求的一种解决方案。
生成数据。
myData <- mapply(rnorm, 1000, 200, mean=seq(-50,50,0.5))
这是一个包含 1000 行(观察值)和 201 个时间点的矩阵。在每个时间点,数据的平均值从 -50 逐渐变化到 50。每次变化 0.5。
获取密度。
myDensities <- apply(myData, 2, density, from=-500, to=500)
这将为您提供每列的密度列表。为了让它们可以并排绘制,我们手动指定了范围(从 -500 到 500)。
从列表中获取密度值。
Ys <- sapply(myDensities, "[", "y")
这又是一个列表。你需要从中得到一个矩阵。
从列表中获取矩阵。
img <- do.call(cbind, Ys)
这只是按列组合了所有 Ys
个元素。
情节。
filled.contour(x=1:ncol(img), y=myDensities[[1]]$x, t(img))
我为此使用 filled.contour。但您可以四处寻找其他二维绘图函数。我还使用了从密度 D[[1]]$x
.
结果如下:
可见从 -50 到 50 的变化。
不确定这是否适用于数百万个时间点。但是绘制百万可能没有什么意义,因为在任何情况下你都会受到像素数量的限制。可能需要某种预处理。