1

我正在建立一个蒙特卡罗模拟,我一直在尝试为 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)

任何帮助将不胜感激。

4

2 回答 2

3

使用您选择的随机数生成器进行复制应该可以解决问题这是一个使用简单二项式分布的示例,概率 = 1/2

replicate(12, rbinom(180, 1, .5), simplify=FALSE)
于 2013-03-06T04:14:41.730 回答
1

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

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)
于 2013-03-06T07:49:46.927 回答