I need to put in code a piecewise function and store generated values in a data frame. The rules are the following:
I tried to do something like this, but as I'm a total novice using R, I couldn't figure out how to define properly each element, and obviously, how to store my results in a data frame.
Here's the "code" I did:
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)}
}
}
}
But even before testing I know it's impossible that it works properly. The data frame that I want to make only may contain values for X and Y.
I know this could be a very basic question, so thank you very much for your answers.
I think:
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