随机 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.mse.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.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 次才能随机 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