2015-08-02 1 views
3

Я могу использовать следующую функцию MyFun (пользовательская) для имитации наблюдений. Но не удалось выяснить, как повторить эту функцию с помощью функции replicate, когда функция возвращает список результатов. Любая помощь будет высоко оценена. БлагодаряИспользование репликации для пользователя define fuction, содержащий mapply и список результатов

MyFun <- function(nSim, Size, Prob) { 
    M1 <- t(mapply(rbinom, prob = Prob, n = nSim, size = Size)) 
    dimnames(M1) <- list(Prob, paste0("V", 1:nSim)) 
    MeanM1 <- M1/Size 
    Results1 <- list(M1, MeanM1) 
    return(Results1) 
} 

MyFun(nSim=5, Size=4, Prob=c(0.2, 0.4)) 

[[1]] 
    V1 V2 V3 V4 V5 
0.2 2 2 1 2 1 
0.4 2 3 0 3 1 

[[2]] 
    V1 V2 V3 V4 V5 
0.2 0.5 0.50 0.25 0.50 0.25 
0.4 0.5 0.75 0.00 0.75 0.25 

Но не дает желаемых результатов с replicate функции.

replicate(
    n=2 
    , MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4)) 
    , simplify = "array" 
) 

    [,1]  [,2]  
[1,] Integer,10 Integer,10 
[2,] Numeric,10 Numeric,10 
+1

Возможно, просто 'lapply (1: 2, function (x) MyFun (nSim = 5, Size = 4, Prob = c (0.2, 0.4)))'? –

+0

Я ответил, но теперь я понимаю ... как возможно, что выход является функцией, является матрицей, в которой каждый элемент является самой матрицей? – SabDeM

ответ

3

Try добавив упрощающий аргумент к вашей функции и передайте его mapply().

MyFun <- function(nSim, Size, Prob, simplify = "array") { 
    M1 <- t(
     mapply(rbinom, prob = Prob, n = nSim, size = Size, SIMPLIFY = simplify) 
    ) 
    dimnames(M1) <- list(Prob, paste0("V", 1:nSim)) 
    MeanM1 <- M1/Size 
    Results1 <- list(M1, MeanM1) 
    return(Results1) 
} 

Затем вызовите его, как это, используя simplify = FALSE в replicate(). Это приведет к созданию списка длины 2 со списком из двух массивов на элемент.

replicate(2, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4)), simplify = FALSE) 

[[1]] 
[[1]][[1]] 
    V1 V2 V3 V4 V5 
0.2 1 0 2 0 0 
0.4 2 0 1 1 0 

[[1]][[2]] 
    V1 V2 V3 V4 V5 
0.2 0.5 0 1.0 0.0 0 
0.4 1.0 0 0.5 0.5 0 


[[2]] 
[[2]][[1]] 
    V1 V2 V3 V4 V5 
0.2 0 0 0 0 1 
0.4 2 1 1 1 0 

[[2]][[2]] 
    V1 V2 V3 V4 V5 
0.2 0 0.0 0.0 0.0 0.5 
0.4 1 0.5 0.5 0.5 0.0 
+0

Отличный вариант @ Рихард. Большое спасибо. Как вы думаете, мой код эффективно написан для большого количества симуляций и повторений? Спасибо – MYaseen208

+0

Я не знаю, используйте его, чтобы написать некоторые тесты :). Мне кажется хорошо, но единственное, что меня беспокоит, это 'mapply()'. Но это не так медленно, поэтому вы должны быть в порядке. Попробуй это! –

3

Ваша функция действительно работает, она имеет только «странный» выход. Попробуйте сохранить результат в объект с именем aa.

aa <- replicate(
+  n=2 
+  , MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4)) 
+  , simplify = T 
+) 
aa 
    [,1]  [,2]  
[1,] Integer,10 Integer,10 
[2,] Numeric,10 Numeric,10 

, но каждый элемент этой матрицы 2 x 2 сам по себе является матрицей. Попробуйте это:

class(aa) 
[1] "matrix" 
sapply(aa, class) 
[1] "matrix" "matrix" "matrix" "matrix" 

В самом деле, если вы извлечь первый «ячейку» из предыдущей матрицы, вы увидите, что это матрица, которая делает содержит вывод MyFun:

aa[1,1] 
[[1]] 
    V1 V2 V3 V4 V5 
0.2 0 1 0 0 1 
0.4 1 2 0 2 0