给定一个 n*2 数据矩阵 X 我想计算每个观察的二元经验 cdf,即对于 1:n 中的每个 i,返回第一个元素不大于 X[i,1] 和第二个的观察百分比元素不大于 X[i,2]。
由于涉及嵌套搜索,即使在将其移植到 Fortran 之后,它在 n ~ 100k 时也会变得非常慢。有谁知道是否有更好的方法来处理这样的样本大小?
编辑:我相信这个问题(就复杂性而言)类似于找到 Kendall 的 tau,它的顺序为 O(n^2)。在这种情况下,Knight (1966) 有一个算法可以将其减少到 O(n log(n))。只是想知道是否有任何 O(n*log(n)) 算法可以找到已经存在的二元 ecdf。
编辑 2:这是我在 Fortran 中的代码,根据要求。这在 R 中以通常的方式调用,因此这里省略了 R 代码。该代码适用于任意维度,但对于我正在做的特定事情,一个双变量就足够了。
! Calculates multivariate empirical cdf for each point
! n: number of observations
! d: dimension (>=2)
! umat: data matrix
! outvec: vector of ecdf
subroutine mecdf(n,d,umat,outvec)
implicit none
integer :: n, d, i, j, k, tempsum
double precision, dimension(n) :: outvec
double precision, dimension(n,d) :: umat
logical :: flag
do i = 1,n
tempsum = 0
do j = 1,n
flag = .true.
do k = 1,d
if (umat(i,k) < umat(j,k)) then
flag = .false.
exit
end if
end do
if (flag) then
tempsum = tempsum + 1
end if
end do
outvec(i) = real(tempsum)/n
end do
return
end subroutine