在R中为Dummy变量创建蒙特卡罗数据

时间:2013-03-06 04:05:59

标签: r matrix montecarlo

我正在设置一个蒙特卡罗模拟,我一直在尝试为180个国家和12个时间段创建一组虚拟变量。鉴于数据点数量很大,是否有更短的方法为时间和国家/地区固定效果创建虚拟变量而不将其从excel文件中拉出来?

例如

   F.T(1)  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0. 1, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0......(Extends until 180 countries)
   F.T(2)  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0. 0, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0......(Extrends until 180 countries)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

使用您选择的随机数生成器进行复制应该可以解决问题 以下是使用带有prob = 1/2

的简单二项分布的示例
replicate(12, rbinom(180, 1, .5), simplify=FALSE)

答案 1 :(得分:1)

我认为首先使用rbinom创建所有数据然后将其转换为矩阵而不是调用rbinom 12次可能更容易/更快。那就是:

set.seed(45)
t <- rbinom(180*12, 1, 0.5)
dim(t) <- c(180, 12)

只是看看是否存在差异,这是一个基准

# I use simplify = TRUE here.
FUN1 <- function(n, a) {
    set.seed(45)
    replicate(n, rbinom(a, 1, .5), simplify = TRUE)
}
FUN2 <- function(n, a) {
    set.seed(45)
    t <- rbinom(n*a, 1, 0.5)
    dim(t) <- c(a, n)
    t
}
require(rbenchmark)
benchmark(t1 <- FUN1(1000, 12000), t2 <- FUN2(1000, 12000), 
            order="elapsed", replications=5)

#                      test replications elapsed relative user.self sys.self
# 2 t2 <- FUN2(1000, 12000)            5   3.991    1.000     3.859    0.111
# 1 t1 <- FUN1(1000, 12000)            5   5.337    1.337     4.785    0.472


identical(t1, t2)
# [1] TRUE

在评论中回答你的问题:

w  <- rep(diag(12)[1:9, ], N)
dim(w) <- c(9, 12*N)
w <- t(w)
colnames(w) <- paste0("t", 1:9)

甚至更好:

w2 <- do.call(rbind, replicate(N, diag(12)[, 1:9], simplify = FALSE))
colnames(w2) <- paste0("t", 1:9)