首页 > 解决方案 > 蒙特卡洛的 Set.seed

问题描述

#year 2022

R.100<-runif(n=100, min = 40, max = 65)
R.100
summary(R.100)

R.norm.100<-rnorm(length(R.100), mean = 50, sd=7)
R.norm.100
summary(R.norm.100)

a=0.6
C=100

f<-seq(from=1.10, to=1.18, by=0.005)
B<-NULL
B<-as.data.frame(B)

for(i in 1:length(f)) {
  for(R in 1:length(R.norm.100)) {
    B[i, "degerler"] <- (R.norm.100[R]-(1-a)*C*f[i]) / R.norm.100[R]
  }
}

summary(B)

在运行上述循环函数并计算 B 时,我希望分子中 R 的模拟数在分母中相同。例如,当计算 B 时,如果分子中的 R 模拟为 55,我希望分母中的 R 为 55。

如何为这个函数编写 R 代码?

最后一件事,我想多次重复这个函数,比如 50 次。

你能帮我吗?最好的问候 Zehra Civan

标签: rloopsfor-loopmontecarloseed

解决方案


当你这样做时:

B[i, "degerler"] <- (R.norm.100[R]-(1-a)*C*f[i]) / R.norm.100[R]

您正在替换每个 R 的计算值。要获得矩阵 B,您可以执行以下操作:

R.norm.100<-rnorm(length(R.100), mean = 50, sd=7)
a=0.6
C=100

f<-seq(from=1.10, to=1.18, by=0.005)
B<-matrix(0,nrow=length(R.norm.100),ncol=length(f))

for(i in 1:length(f)) {
  for(R in 1:length(R.norm.100)) {
    B[R,i] <- (R.norm.100[R]-(1-a)*C*f[i]) / R.norm.100[R]
  }
}

summary(B)

在 R 中,您不需要遍历所有元素,只需将您拥有的函数应用于向量本身。例如:

i=1
result_1 = vector("numeric",length(R))
for(R in 1:length(R.norm.100)) {
        result_1[R] <- (R.norm.100[R]-(1-a)*C*f[i]) / R.norm.100[R]
      }
result_2 = (R.norm.100-(1-a)*C*f[i]) / R.norm.100
identical(result_1,result_2)
[1] TRUE

因此,您可以通过执行以下操作完全跳过双重 for 循环:

B = sapply(f,function(i)(R.norm.100[R]-(1-a)*C*i) / R.norm.100)

这会给你你需要的结果


推荐阅读