【发布时间】:2013-03-05 07:23:33
【问题描述】:
我有一个矩阵 z (3 x 20000)。将每一行视为一个随机变量,将每一列视为一个模拟。我在R 中编写了以下函数,使用apply 命令查找3 维的经验累积分布函数(EMP.CDF)。这个 k 变量经验 CDF 在 this pdf 第 2 页的“多元 ECDF”部分下进行了解释。
EMP.CDF=function(z) {
# z is a matrix (3 x 20000) and each row is a realization of a random variable
q1=z[1,];q2=z[2,];q3=z[3,]
# qi = the realization of the ith random variable, i=1,2,3
# Now I am going to evaluate the empirical cumulative distribution function at
# each column of z
# Given each column, the function should return an empirical
# cumulative probability.
d=apply(z,2, function(x) sum(q1<=x[1] & q2<=x[2] & q3<=x[3])/(length(q1)))
return(d)}
> z=matrix(0,3,20000)
> z[1,]=runif(20000,1,2)
> z[2,]=runif(20000,3,5)
> z[3,]=runif(20000,7,9)
> system.time(EMP.CDF(z))
user system elapsed
30.18 0.01 30.39
在上面的代码中 k=3。有什么办法可以对上述函数进行矢量化以减少系统时间?
【问题讨论】:
-
你能解释一下你想要做什么(在你的代码中)吗?为什么要将所有列值与第一行、第二行和第三行进行比较(
q1,q2,q3)?这对我来说似乎没有意义。 -
当然,请查看我添加到我的问题中引用的 pdf。我正在尝试计算 $\hat{F_{(X1,X2,X3)}(u1,u2,u3)}$。这里 $X_i$ (i=1,2,3) 是第 i 个随机变量,即 z 的第 i 行或在我的代码中,q1、q2 和 q3。现在该函数需要 3 个数字作为 $u1,u2,u3$。对于每个 $u_i$ (i=1,2,3),它首先查看第 i 行并返回 TRUE 和 FALSE 的向量。通过使用 & 内部总和,我将这 3 个布尔向量相交。通过使用“sum”,它计算 TRUE 的数量,然后将其除以 20000,即列数或模拟次数。
标签: performance r simulation apply systemtime