为R中的虚拟变量创建蒙特卡罗数据

为R中的虚拟变量创建蒙特卡罗数据,r,matrix,montecarlo,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

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

任何帮助都将不胜感激。

将replicate与您选择的随机数生成器一起使用应该可以实现这一目的 下面是一个使用prob=1/2的简单二项分布的示例

replicate(12, rbinom(180, 1, .5), simplify=FALSE)

将replicate与您选择的随机数生成器一起使用应该可以做到这一点 下面是一个使用prob=1/2的简单二项分布的示例

replicate(12, rbinom(180, 1, .5), simplify=FALSE)

我认为首先使用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)

我认为首先使用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)


R有很多函数来生成随机数据,它们非常容易使用。你到底想做什么?R有很多函数来生成随机数据,它们非常容易使用。你到底想干什么?我想他可能想要复制。。。相反,但很难说确定。感谢您的深入了解,我正在尝试生成具有12列和180行的虚拟变量,这些变量采用0和1的交替值。尽管如此,您的答案还是很有帮助。@SamChu,在这种情况下,您可能希望使用simplify=TRUE,但请保留180&12,因为simplify将转换您的matrix@RicardoSaporta有没有比这更快的方法?t1是的,您可以使用分配和粘贴。详细信息不在评论部分。我建议发布一个新问题并链接回来。我想他可能想要复制12。。。相反,但很难说确定。感谢您的深入了解,我正在尝试生成具有12列和180行的虚拟变量,这些变量采用0和1的交替值。尽管如此,您的答案还是很有帮助。@SamChu,在这种情况下,您可能希望使用simplify=TRUE,但请保留180&12,因为simplify将转换您的matrix@RicardoSaporta有没有比这更快的方法?t1是的,您可以使用分配和粘贴。详细信息不在评论部分。我建议发布一个新问题并链接回来。非常感谢。最后一个问题,只是评论中前一个问题的一个细微变化。我说的是完全相同的矩阵设置,而不是现在数字的交替不同。如果我想要像1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0之类的东西,而不是1,0,0,0,0,0,0,0,0,0,0等,会怎么样。在一种情况下,我不太明白。你想要这个矩阵?是的,矩阵。例如,对于第一列,前12个数字为“1”,其余为“0”。对于第二列,前12个数字是“0”,下12个数字是“1”,其余的数字是“0”…依此类推。我认为您的第二列描述无效。你已经解释了12个1和12个0,那么剩下的0是什么意思?你是说第二列是:0,12 1,11 0吗?对不起,我指的是矩阵rows=N*12和columns=12多谢了。最后一个问题,只是评论中前一个问题的一个细微变化。我说的是完全相同的矩阵设置,而不是现在数字的交替不同。如果我想要像1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0之类的东西,而不是1,0,0,0,0,0,0,0,0,0,0等,会怎么样。在一种情况下,我不太明白。你想要这个矩阵?是的,矩阵。例如,对于第一列,前12个数字为“1”,其余为“0”。对于第二列,前12个数字是“0”,下12个数字是“1”,其余的数字是“0”…依此类推。我认为您的第二列描述无效。你已经解释了12个1和12个0,那么剩下的0是什么意思?你是说第二列是:0,12 1,11 0吗?对不起,我指的是矩阵rows=N*12和columns=12