2017-03-16 96 views
0

我有多个函数可以产生随机数。所有这些功能都描述了相同的过程。我想随机选择一个函数100次,执行它并将结果(每个函数执行100行)保存在一个表中。从列表中随机选择并执行一个功能。重复这个过程并保存输出

对于我已经写以下代码功能:

# AKBAS u.a. (2009) 
akbas <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    for(i in 1:n){ 
    print(x.m[i] <- runif(n = 1, min = 0, max = 1)) 
    se.m[i] <- 0.17 * (x.m[i]^2) - 0.03 * x.m[i] 
    print(x.st[i] <- runif(n = 1, min = 1, max = 5)) 
    se.st[i] <- 0.17 * (x.st[i]^2) - 0.03 * x.st[i] 
    } 
    return(list(se.m, se.st)) 
} 
se.akbas <- matrix(unlist(akbas(100)),100, 2) 

# FUCHS u.a.(2007) 
fuchs07 <- function(n){ 
    x.m=se.m=x.st=se.st=NULL #solves indexing problem 
    for(i in 1:n){ 
    print(x.m[i] <- runif(n = 1, min = 0, max = 1)) 
    se.m[i] <- 0.11 * (x.m[i]^2) - 0.02 * x.m[i] 
    print(x.st[i] <- runif(n = 1, min = 1, max = 5)) 
    se.st[i] <- 0.11 * (x.st[i]^2) - 0.02 * x.st[i] 
    } 
    return(list(se.m, se.st)) 
} 
se.fuchs07 <- matrix(unlist(fuchs07(100)),100, 2) 

# BELL AND GLADE (2004) 
bell.glade <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    for(i in 1:n){ 
    se.m[i] <- runif(n = 1, min = 0, max = 1) 
    se.m[i] <- 0.2 
    se.st[i] <- runif(n = 1, min = 1, max = 5) 
    se.st[i] <- 0.5 
    } 
    return(list(se.m, se.st)) 
} 
se.bell.glade <- matrix(unlist(bell.glade(100)),100, 2) 

# BORTER (1999b,a) 
borter <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    for(i in 1:n){ 
    se.m[i] <- runif(n = 1, min = 0, max = 1) 
    se.m[i] <- 0.1 
    se.st[i] <- runif(n = 1, min = 1, max = 5) 
    se.st[i] <- 0.5 
    } 
    return(list(se.m, se.st)) 
} 
se.borter <- matrix(unlist(borter(100)),100, 2) 

# FELL UND HARTFORD (1997) 
fell.hartford <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    for(i in 1:n){ 
    se.m[i] <- ifelse (runif(n = 1, min = 0, max = 1) < 0.25, 0.1, 0.4) 
    se.st[i] <- ifelse (runif(n = 1, min = 1, max = 5) < 1.5, 0.4, 0.7) 
    } 
    return(list(se.m, se.st)) 
} 
se.fell.hartford <- matrix(unlist(fell.hartford(100)),100, 2) 

funktionen <- list(se.akbas, se.bell.glade, se.borter, se.fell.hartford, se.fuchs07) 
murgang <- do.call(rbind, funktionen) 

的最终输出应在长格式 - se.m和se.st层叠。我包含一个指标列,其中se.m的值为1,se.st的值为2。这里输出的一小部分:

495   1 0.0228 
496   1 0.0494 
497   1 0.0158 
498   1 0.0169 
499   1 0.0357 
500   1 0.0436 
501   2 0.3459 
502   2 2.7998 
503   2 3.6571 
504   2 3.1501 
505   2 2.7418 
506   2 0.5286 

但是我坚持随机功能选择get.f的prozess。我正在考虑类似:

get.f <- function(m){ 
    sample(funktionen, 100, replace = TRUE) 
} 

如何保存结果?

有没有简单说明这个过程的建议?我确信有一种更有效的方法,但我还没有找到它。

我是R新人,对任何建设性评论和/或批评都会高度评价。 PS:这可能不是有史以来最好的问题,我知道你评价我-1。但如果你这样做,请告诉我为什么,所以我可以改善,而不是在将来犯同样的错误。

+0

为什么不只是采样函数的* indices *并在列表中调用它们? 'ss < - sample(length(funktionen),size = 100,replace = TRUE); res < - unlist(lapply(ss,function(i)funktionen [[i]](100))?? –

回答

0

首先对功能进行改进。您不需要for循环1:n然后设置runif(n = 1 ...),而只需设置runif(n ...),其中n作为参数提供给您的函数。

你也不需要列出结果se.mse.st内的函数,然后在unlist中设置为矩阵。相反,请返回cbind的结果。请看下图:

bell.glade <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    se.m <- runif(n, min = 0, max = 1) 
    se.st <- runif(n, min = 1, max = 5) 
    return(cbind(se.m, se.st)) 
} 
bell.grade(4) # where n=4 

其次,我想你忘了删除bell.gradeborter常量您设置se.mse.st到,你可能用它们来解决问题,我在下面的最终版本中删除它们。

下面是功能,现在,(我加的测试功能名称的打印):

# AKBAS u.a. (2009) 
akbas <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    print(x.m <- runif(n, min = 0, max = 1)) 
    se.m <- 0.17 * (x.m^2) - 0.03 * x.m 
    print(x.st <- runif(n, min = 1, max = 5)) 
    se.st <- 0.17 * (x.st^2) - 0.03 * x.st 
    print("akbas") 
    return(cbind(se.m, se.st)) 
} 
# FUCHS u.a.(2007) 
fuchs07 <- function(n){ 
    x.m=se.m=x.st=se.st=NULL #solves indexing problem 
    print(x.m <- runif(n, min = 0, max = 1)) 
    se.m <- 0.11 * (x.m^2) - 0.02 * x.m 
    print(x.st <- runif(n, min = 1, max = 5)) 
    se.st <- 0.11 * (x.st^2) - 0.02 * x.st 
    print("fuchs07") 
    return(cbind(se.m, se.st)) 
} 
# BELL AND GLADE (2004) 
bell.glade <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    se.m <- runif(n, min = 0, max = 1) 
    se.st <- runif(n, min = 1, max = 5) 
    print("bell.glade") 
    return(cbind(se.m, se.st)) 
} 
# BORTER (1999b,a) 
borter <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    se.m <- runif(n, min = 0, max = 1) 
    se.st <- runif(n, min = 1, max = 5) 
    print("borter") 
    return(cbind(se.m, se.st)) 
} 
# FELL UND HARTFORD (1997) 
fell.hartford <- function(n){ 
    x.m=se.m=x.st=se.st=NULL 
    se.m <- ifelse (runif(n, min = 0, max = 1) < 0.25, 0.1, 0.4) 
    se.st <- ifelse (runif(n, min = 1, max = 5) < 1.5, 0.4, 0.7) 
    print("fell.hartford") 
    return(cbind(se.m, se.st)) 
} 

这里是功能列表:

funktionen <- list(akbas, bell.glade, borter, fell.hartford, fuchs07) 

注意使用do.call到访问funktionen中的函数列表,这里我们测试borter

do.call(funktionen[[3]], args=list(n=1)) # borter 
[1] "borter" 
      se.m se.st 
[1,] 0.7996913 1.505884 

现在它意味着funktionen的索引1:5是需要采样100次才能随机返回列表中5个函数中的1个函数的100次。

fxn_list_sample <- sample(1:5, 100, replace=T) 
fxn_list_result <- sapply(fxn_list_sample, function(x) do.call(funktionen[[x]], args=list(n=1))) 
fxn_list_result 

这将打印被调用函数的随机序列。fxn_list_result返回具有第一行se.m值的第二行se.st值的2x100矩阵。你可以转换成长形式。如果需要重新设置种子set.seed

+0

谢谢@RS,这就是我正在寻找的东西,关于函数'bell.grade'和'borter'我的意思是把常量赋给指定的inteval。我改进了命令:'se.m [i] < - ifelse(runif(n = 1,min = 0,max = 1)<1,0.2 ,0.2)''do.call'功能很好,但我不明白为什么R将se.m和se.set改为v1和v2保留原名或是否需要手动重命名'v1'和'v2'? – Danka

+0

我的意思是'se.st'而不是'se.set' ...我的道歉! – Danka

+0

@Danka,我不确定为什么你想在你的函数中设置n = 1,当n是你的函数的参数,例如bell.grade < - function(n){...},它是在你调用你的函数时定义的;同样你不需要正如我上面解释的那样,我不明白你的ifelse陈述,参见'ifelse', ts被定义为'ifelse(test,yes,no)'。如果0和1之间的随机单一数字小于1,则测试语句读取,如果使用0.2,如果不使用0.2。为什么要通过“runif”号码? – Djork

相关问题