2017-10-11 4 views
0

Rrt t- 분포 샘플러에서 비 중심성 매개 변수를 벡터화해야합니다. 그러나, 내가 제공 :R의 벡터화 분포

rt(2, df = 1, ncp = c(1,2)) 

나는 비슷한 문제가없는 등 rbinom 또는 rgamma 같은

Warning message: 
In if (is.na(ncp)) { : 
    the condition has length > 1 and only the first element will be used 

다른 기능을 얻을 수 (rbinom에서 즉 prob 인수는 규모의 인수가 될 수 벡터화 할 수 있습니다 rgamma).

루프를 사용하지 않는 방법이 있습니까?

답변

2

sapply을 사용할 수

sapply(1:3, function(x) rt(2, df = 1, ncp = x)) 
#   [,1]  [,2]  [,3] 
# [1,] 0.3881308 1.905535 1.781836 
# [2,] -0.7950962 2.905824 1.633683 

각 열을 생성 행렬 ncp의 다른 값에 해당한다.

1

성능이 비슷한 lapply, sapply 또는 vapply을 사용할 수 있습니다. lapplyvapplysapply보다 약간 빠릅니다. sapply은 결과를 더 예쁘게/더 단순하게 만들기 위해 lapply에 대한 래퍼이기 때문에입니다.

microbenchmark::microbenchmark(
    vapply(c(1,2, 3), function(x) rt(2, df = 1, ncp=x), numeric(2L)), 
    sapply(1:3, function(x) rt(2, df = 1, ncp = x)), 
    lapply(1:3, function(x) rt(2, df = 1, ncp = x)), 
    vec.rt(2, df=1, ncp=1:3)) 

#Unit: microseconds 
# expr min  lq  mean median  uq  max neval cld 
#vapply 27.121 37.6095 51.61055 39.8825 42.4570 1226.199 100 a 
#sapply 51.438 58.1725 72.89417 60.9150 63.4850 1255.270 100 ab 
#lapply 29.484 34.0670 59.78256 36.8160 39.0755 2326.401 100 ab 
#vec.rt 95.511 101.6985 106.15785 105.0770 108.2700 189.312 100 b 
+1

비교해 주셔서 감사합니다! 한가지 명심해야 할 것은'sapply'는'lapply'를 감싸는 래퍼이며 출력을 행렬로 변환하는 단순화 단계가 추가되어 실행 시간이 늘어납니다. –

3

또 다른 옵션은 Vectorize와 의사 벡터화 기능을 만드는 것입니다. 예를 들어, ncp 인수에 대한 rt을 벡터화하기 위해, 당신은 할 수 있습니다 :

vec.rt <- Vectorize(rt, "ncp") 

기능은 이전에 시도 코드로 사용할 수 있습니다. 이 당신에게 실제 벡터화 기능을주고,도 의지 sapply 또는 lapply하지 않는

vec.rt(2, df=1, ncp=c(1,2)) 
#   [,1]  [,2] 
# [1,] 3.314060 5.300499 
# [2,] 2.423883 1.299248 

참고. 이 모든 함수는 내부적으로 루프를 사용하기 때문에 완전히 쓰여진 for 구문과 비교하여 성능이 향상되지는 않습니다.