2017-10-11 6 views
0

Rrt t分布サンプラーで非中心性パラメーターをベクトル化する必要があります。しかし、ときに私は与える:Rの分布をベクトル化する

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

が、私は同様の問題を持っていないようrbinomrgammaなど

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

同様のパフォーマンスを持つlapplysapply、またはvapplyを使用できます。 sapplyは結果をよりきれいに/簡潔にしようとするlapplyへのラッパーであるため、sapplyより少し速くなります。lapplyvapply

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

もう1つのオプションは、Vectorizeで擬似ベクトル化関数を作成することです。例えば、ncp引数に関してrtをベクトル化するために、あなたが行うことができます:

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

機能を使用すると、以前に試したコードのように使用することができます。

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

これはあなたの本当のベクトル化機能を持たないことに注意し、どちらも意志sapplyまたはlapply。これらの関数はすべて内部的にループを使用するため、きれいに書かれたfor構造体と比較してパフォーマンスの向上は見られません。

関連する問題