【发布时间】:2017-03-20 13:17:44
【问题描述】:
我正在尝试在 R 中编写函数,但不断收到错误消息。在 1 次模拟运行中,我从 2 个间隔生成随机值 - 以生成 2 个不同的输出值。
- se.m 如果输入参数在 [0, 1] 范围内
- se.st 如果输入参数位于 [1, 5] 以内
(可忽略的浮点数)
然后,这些随机生成的值被用作以下函数的输入:
这是我使用的代码:
fuchs08 <- 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.33, 0, 0.12 * (x.m[i]^2) - 0.04 * x.m[i])
se.st[i] <- ifelse (runif(n = 1, min = 1, max = 5) < 3.06, 0.12 * (x.m[i]^2) - 0.04 * x.m[i], 1)
}
return(cbind(se.m, se.st))
}
我没有得到任何结果。我相信错误出现在 ifelse 语句中,但找不到解决方案。
> fuchs08(5)
se.m se.st
[1,] 0 NA
[2,] NA 1
[3,] NA 1
[4,] NA NA
[5,] 0 1
总体思路是将此函数添加到名为funktionen 的函数列表中。然后我运行了 100 次模拟。模拟 1 从列表funktionen 中随机选择一个函数并执行它。 (函数为上述整数创建两个输出:se.m 和 se.st,它们与模拟 2:99 的输出相结合)因此该函数需要采用以下格式:function(n) 以便运行随机函数选择.这是我的那部分代码:
funktionen <- list(akbas, bell.glade, borter, fell.hartford, fuchs07, fuchs08)
fxn_list_sample <- sample(1:5, 100, replace=T)
fxn_list_result <- unlist(sapply(fxn_list_sample, function(x) do.call(funktionen[[x]], args=list(n=1))))
results <- as.data.frame(t(fxn_list_result))
colnames(results) <- c("se.m", "se.st")
results <- melt(results)
results$value <-round(results$value, 4)
separate(results, variable, into = c("Parameter", "Intensitaet")) %>%
mutate(Intensitaet = c(3, 2) [(Intensitaet == "m")+1])
有什么建议可以解决这个问题吗?
【问题讨论】:
-
我并不感到惊讶——你的
x.m是空的,当然访问它不会产生适当的值。我也不确定你为什么在循环中使用已经矢量化的ifelse。这感觉多余,但我可能只是误解了您的要求。 -
@Konrad 感谢您的意见。事实上,我不确定我是否已经很好地解释了自己。因此我编辑了这个问题。对于你的问题,为什么我使用了一个看起来很重的循环?我对列表
funktionen中的其他函数(此处未显示)使用了相同的过程。我基本上不知道更好......