소위 순위 통계의 이중 합계를 계산하는 R 코드를 작성했습니다.R : 트리플 루프를 '벡터화'
최소 1000 번 계산을 반복해야하지만 내부에 3 개의 루프가 있으면 한 번만 수행하는 데 꽤 오랜 시간이 걸립니다. 여기
내 코드입니다 :#u, a - real numbers
l <- function(u, a) {
-sqrt((1-a)/a)*I(u>=0 & u<a) + sqrt(a/(1-a))*I(u>=a & u<=1)
}
# r,s - real number, R,S - vectors of real numbers (equal lengths)
L<-function(r, s, R, S) {
n<-length(R)
x<-0
for (i in 1:n) {
x<-x+l(R[i]/(n+1),r) * l(S[i]/(n+1),s)
}
1/sqrt(n)*x
}
# r, s, X, Y - vectors of real numbers; X and Y must be equally long
Q<-function(r,s,X,Y) {
n<-length(X)
R<-rank(X)
S<-rank(Y)
q<-0
for (j in 1:length(r)) {
for (k in 1:length(s)) {
q<-q+L(r[j],s[k],R,S)^2
}
}
q
}
내가 R의 크기 s는 동일 (도 않을 수 있기 때문에 다음 첫 번째 기능이 실패 sapply 사용하여 내 기능을 변환 및 적용되지만 시도해야 길이의 r, s는 X (또는 Y)의 길이와 같음).
루프를 없애기 위해 4 개의 벡터를 사용하여 행렬을 생성하는 함수 L을 만드는 방법이 있습니까?
미리 감사드립니다.
// 편집 :
내가 mapply 사용하여 다른 기능을 작성했습니다 :
Q1<-function(r,s,X,Y) {
n<-length(X)
R<-rank(X)
S<-rank(Y)
rs <- expand.grid(r,s)
q<-do.call(mapply, c(function(r,s) L(r,s,R=R,S=S)^2, unname(rs)))
sum(q)
}
하지만 그것도 느린 것 같다. (.) :
rs <- expand.grid(r=r,s=s); rm(r); rm(s)
#edit
rs$qrs <- with(rs, L(r, s, R, S)^2)
q <- sum(rs$qrs)
나는이 빨리 될 것입니다 확신 아니에요 당신이 r
및 s
의 값을 변화시키는 L의 모든 값을 생성 할 경우
속도가'L 사용^2' 대신 할 배 L 함수를 호출하기보다는 (R [J]를, R, S [K] S) k], R, S) * L (r [j], s [k], R, S)'. 또한 연결하는 것보다 위치에 할당하는 벡터를 predimension하는 것이 더 빠릅니다. –
글쎄, 참으로 - 도움이 곱셈 대신에^2를 사용하면, 지금은 거의 2 배 빨라진다. 고마워. 두 함수의 누적 합계를 연결로 대체하여 ca를 저장했습니다. 0.1 초. 그래도 루프를 생략하는 방법이 있는지 궁금해합니다 (실제로는 시간이 덜 필요함). – xpenguinx
사전 치수에 대한 제안 사항을 이해하지 못했는지 확인하십시오. 자신이 한 일을 보여주기 위해 코드를 편집해야합니다. –