Создание данных Монте-Карло для фиктивных переменных в R

Я создаю симуляцию Монте-Карло и пытаюсь создать набор фиктивных переменных для 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)

Любая помощь будет принята с благодарностью.


person Sam Chu    schedule 06.03.2013    source источник
comment
R имеет множество функций для генерации случайных данных, и ими очень легко пользоваться. Что именно ты пытаешься сделать?   -  person Matthew Lundberg    schedule 06.03.2013


Ответы (2)


Я думаю, что было бы проще/быстрее сначала создать все данные с помощью 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)
person Arun    schedule 06.03.2013
comment
Огромное спасибо. Последний вопрос, просто небольшая вариация предыдущего вопроса в комментарии (я говорю о точно такой же настройке матрицы, вместо этого числа теперь чередуются по-другому). Что, если я хочу что-то вроде 1,1,1,1,1,1,1,1,1,1,1,1 0,0,0,0,0,0,0,0,0,0,0 ,0 вместо 1,0,0,0,0,0,0,0,0,0,0,0 и т. д. в матрице - person Sam Chu; 06.03.2013
comment
не совсем уследить. вы хотите это как матрица? - person Arun; 06.03.2013
comment
Ага, матрица. Например, для первого столбца первые 12 чисел равны «1», а остальные — «0». Во втором столбце первые 12 чисел равны «0», следующие 12 — «1», а остальные — «0»... И так далее. - person Sam Chu; 06.03.2013
comment
Я думаю, ваше описание второго столбца неверно. вы уже учли 12 единиц и 12 нулей, а что вы имеете в виду под остальными 0? Вы имеете в виду для второго столбца как: 0, 12 1, 11 0? - person Arun; 06.03.2013
comment
Извините, я имел в виду матрицу (строк = N * 12 и столбцов = 12). - person Sam Chu; 06.03.2013

Использование replicate с выбранным вами генератором случайных чисел должно помочь. Вот пример использования простого биномиального распределения с prob = 1/2.

replicate(12, rbinom(180, 1, .5), simplify=FALSE)
person Ricardo Saporta    schedule 06.03.2013
comment
Я думаю, что вместо этого он мог бы хотеть replicate(12, ..., но трудно сказать наверняка. - person Matthew Lundberg; 06.03.2013
comment
Спасибо за понимание, я пытаюсь создать фиктивные переменные с 12 столбцами и 180 строками, которые принимают чередующиеся значения 0 и 1. Тем не менее ваш ответ очень полезен. - person Sam Chu; 06.03.2013
comment
@SamChu, в этом случае вы можете использовать simplify=TRUE (но оставьте 180 и 12 там, где они есть, так как simplifying транспонирует вашу матрицу) - person Ricardo Saporta; 06.03.2013
comment
@RicardoSaporta, есть ли более быстрый способ сделать что-то подобное? t1 ‹- повторить(N,матрица(c(1,0,0,0,0,0,0,0,0,0,0,0))) t2 ‹- повторить(N,матрица(c(0, 1,0,0,0,0,0,0,0,0,0,0))) t3 ‹- повторить(N,матрица(c(0,0,1,0,0,0,0,0) ,0,0,0,0))) t4 ‹- повторить(N,матрица(c(0,0,0,1,0,0,0,0,0,0,0,0))) t5 ‹ - повторить(N,матрица(c(0,0,0,0,1,0,0,0,0,0,0,0))) t6 ‹- повторить(N,матрица(c(0,0, 0,0,0,1,0,0,0,0,0,0))) t7 ‹- повторить(N,матрица(c(0,0,0,0,0,0,1,0,0 ,0,0,0))) t8 ‹- повторить(N,матрица(c(0,0,0,0,0,0,0,1,0,0,0,0))) t9 ‹- повторить (N,matrix(c(0,0,0,0,0,0,0,0,1,0,0,0))) FT ‹- cbind(t1,t2,t3,t4,t5,t6, т7,т8,т9) - person Sam Chu; 06.03.2013
comment
да, вы можете использовать назначение и вставку. Детали не помещаются в разделе комментариев. Я бы предложил опубликовать новый вопрос и дать обратную ссылку. - person Ricardo Saporta; 06.03.2013