3

区分関数をコードに入れ、生成された値をデータ フレームに格納する必要があります。ルールは次のとおりです。

  • Bernoulli(1/3) によって生成されるオブジェクト X があります。
  • X=0 の場合、別のオブジェクト Y が E = Exponential(1) によって生成されます。
  • X=1 の場合、Y は、E <= P の場合は E によって生成され、E > P の場合は (P + EL) によって生成されます。ここで、P は定数 (たとえば 1) であり、E から独立した EL = Exponential(Lambda) です。
  • この方法で得られた X と Y の 100 サンプルでデータ フレームを生成し、さらに、このプロセスを 10000 回実行します (つまり、10000 データ フレームを生成します)。

私はこのようなことをしようとしましたが、R を使用するまったくの初心者であるため、各要素を適切に定義する方法と、結果をデータ フレームに格納する方法が明らかにわかりませんでした。

これが私がやった「コード」です:

test <- function(lambda,p) {
for (i in 1:10000) { # Number of simulations that I want to do.
for(j in 1:100) { # Sample size of each simulation / data frame.
  x <- rbinom(1,1,1/3)
  e <- rexp(1,1)
  if (x==0) {y <- e}
  else {
    if (e<=p) {y <- e}
  else {y <- p + rexp(1, lambda)}
    }
  }
}    

しかし、テストする前でさえ、それが適切に機能することは不可能であることを知っています. 作成したいデータ フレームには、X と Y の値が含まれている場合があります。

初歩的な質問かもしれませんが、よろしくお願いします。

4

1 に答える 1

3

おもう:

simfun <- function(n=100,lambda=1,P=1,ret.df=TRUE) {
    X <- rbinom(n,prob=1/3,size=1)
    E <- rexp(n,1)
    EL <- rexp(n,lambda)
    Y <- ifelse(X==0,E,
                ifelse(E<=P,E,P+E*EL))
    ## return data frame or matrix
    if (ret.df) data.frame(X,Y) else cbind(X,Y)
}
system.time(res <- replicate(1e4,simfun(),simplify=FALSE))
## 6 seconds

## or:
library(plyr)
system.time(res2 <- raply(1e4,simfun(ret.df=FALSE),.progress="text")  
## returns a 1e4 x 100 x 2 array, maybe more convenient: use
## rlply instead of raply (and ret.df=TRUE) to match the previous
## results
于 2013-07-19T00:33:27.663 に答える