2014-06-15 1 views
0

2 개의 컷오프 경계 범위에있는 숫자 벡터의 평균을 찾고 싶습니다. (이상 치를 제어하는 ​​평균을 계산할 수있는 순진한 방법을 제공합니다).벡터의 평균 찾기, R에서 퀀텀 컷오프 제외


예 : 세 인수 x 숫자의 벡터 lower 하부 바운드 차단하고 upper, 상한 컷오프.

meanSub <- function(x, lower = 0, upper = 1){ 
    Cutoffs <- quantile(x, probs = c(lower,upper)) 
    x <- subset(x, x >= Cutoffs[1] & x <= Cutoffs[2]) 
    return(mean(x)) 
} 

분명이 일에 많은 해협 앞으로 가지 방법이 있습니다. 그러나, 나는이 기능을 많은 관찰을 통해 적용하고 있습니다 - 당신이 매우 빠르게 수행 할 기능 디자인이나 기존 패키지에 대한 팁을 제공 할 수 있는지 궁금합니다.

답변

4

trim 인수의 0이 아닌 값에 대해 동일한 방법 mean을 사용할 수 있습니다.

meanSub_g <- function(x, lower = 0, upper = 1){ 
    Cutoffs <- quantile(x, probs = c(lower,upper)) 
    return(mean(x[x >= Cutoffs[1] & x <= Cutoffs[2]])) 
} 

meanSub_j <- function(x, lower=0, upper=1){ 
    if(isTRUE(all.equal(lower, 1-upper))) { 
    return(mean(x, trim=lower)) 
    } else { 
    n <- length(x) 
    lo <- floor(n * lower) + 1 
    hi <- floor(n * upper) 
    y <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi] 
    return(mean(y)) 
    } 
} 

require(microbenchmark) 
set.seed(21) 
x <- rnorm(1e6) 
microbenchmark(meanSub_g(x), meanSub_j(x), times=10) 
# Unit: milliseconds 
#   expr  min   lq  median   uq  max neval 
# meanSub_g(x) 233.037178 236.089867 244.807039 278.221064 312.243826 10 
# meanSub_j(x) 3.966353 4.585641 4.734748 5.288245 6.071373 10 
microbenchmark(meanSub_g(x, .1, .7), meanSub_j(x, .1, .7), times=10) 
# Unit: milliseconds 
#     expr  min  lq median  uq  max neval 
# meanSub_g(x, 0.1, 0.7) 233.54520 234.7938 241.6667 272.3872 277.6248 10 
# meanSub_j(x, 0.1, 0.7) 94.73928 95.1042 126.7539 128.6937 130.8479 10 
3

내가 subset를 호출 할 것이다, 그것은 느려질 수 있습니다 :

meanSub <- function(x, lower = 0, upper = 1){ 
    Cutoffs <- quantile(x, probs = c(lower,upper)) 
    return(mean(x[x >= Cutoffs[1] & x <= Cutoffs[2]])) 
} 

그렇지 않으면 코드를 확인하고 매우 빠른 이미 있어야합니다. 물론 메모리 내 데이터에 대한 단일 스레드 계산이 관련되어 있습니다.