随机 select 并从列表中执行一个函数。重复该过程并保存输出
randomly select and execute a function from a list. Repeat the process and save the outputs
我有多个生成随机数的函数。所有这些功能都描述了相同的过程。我想随机选择一个函数 100 次,执行它并将结果(每次函数执行 100 行)保存在 table 中。
对于函数我写了如下代码:
# 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
。我在想类似的东西:
get.f <- function(m){
sample(funktionen, 100, replace = TRUE)
}
如何保存结果?
有什么简化这个过程的建议吗?我确信有一种更有效的方法,但我还没有找到它。
我是 R 的新手,非常感谢任何建设性的评论 and/or 批评。
PS:这可能不是有史以来最好的问题,我知道你给我打了 -1 分。但是如果你这样做了,请告诉我为什么,这样我可以改进,以后不会再犯同样的错误。
首先是对功能的改进。您不需要 for 循环 1:n 然后设置 runif(n=1...),而只需设置 runif(n...),其中 n 作为参数提供给您的函数。
您也不需要在函数中列出结果 se.m
和 se.st
,然后取消列出并设置为矩阵。相反,return 一个 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.grade
和 borter
中您设置 se.m
和 se.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 次才能随机 return 调用列表中 5 个函数中的任何一个函数 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
return 是一个 2x100 矩阵,第一行 se.m 值,第二行 se.st 值。你可以变成长形。如果需要重现性,请设置种子 set.seed
。
我有多个生成随机数的函数。所有这些功能都描述了相同的过程。我想随机选择一个函数 100 次,执行它并将结果(每次函数执行 100 行)保存在 table 中。
对于函数我写了如下代码:
# 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
。我在想类似的东西:
get.f <- function(m){
sample(funktionen, 100, replace = TRUE)
}
如何保存结果?
有什么简化这个过程的建议吗?我确信有一种更有效的方法,但我还没有找到它。
我是 R 的新手,非常感谢任何建设性的评论 and/or 批评。
PS:这可能不是有史以来最好的问题,我知道你给我打了 -1 分。但是如果你这样做了,请告诉我为什么,这样我可以改进,以后不会再犯同样的错误。
首先是对功能的改进。您不需要 for 循环 1:n 然后设置 runif(n=1...),而只需设置 runif(n...),其中 n 作为参数提供给您的函数。
您也不需要在函数中列出结果 se.m
和 se.st
,然后取消列出并设置为矩阵。相反,return 一个 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.grade
和 borter
中您设置 se.m
和 se.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 次才能随机 return 调用列表中 5 个函数中的任何一个函数 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
return 是一个 2x100 矩阵,第一行 se.m 值,第二行 se.st 值。你可以变成长形。如果需要重现性,请设置种子 set.seed
。