在 r 中迭代一个函数
Iterate a function in r
我是 R 的完全新手,但真的很想"learn by doing",所以请原谅我的简单问题。
我有以下代码:
MC <- function(PV, t,...){
i <- rnorm(1, .056, .01)
FV <- PV*exp(i*t)
r <- log(FV/PV)
}
MC(1,1)
我需要多次迭代该函数,为 r 提供许多不同的值。然后我需要找到所有结果的标准偏差(也许将它们绘制成直方图?)。我曾尝试使用在线指南编写循环,但似乎找不到任何特定于我的问题的内容。我似乎总是以创建一个无限循环而告终,而且似乎无法编写有效的中断命令。
我确定我缺少一些基本的东西,但对于我来说,我似乎无法解决它。
您可以在函数中使用不同的 PV 和 t 值以及 return r 值进行迭代(循环)。为 r 使用一些阈值可以打破循环。
MC <- function(PV, t){
i <- rnorm(1, .056, .01)
FV <- PV*exp(i*t)
r <- log(FV/PV)
print(r)
return(r)
}
for (PV in 1:10){
for (t in 2:9){
th = MC(PV,t)
if(th>0.2){
break
}
}
}
首先,您的函数需要 return 一些东西。现在它正在为您无法访问的环境中的变量设置一个值。我建议:
MC <- function(PV, t,...){
i <- rnorm(1, .056, .01)
FV <- PV*exp(i*t)
log(FV/PV)
}
replicate()
函数旨在重复评估具有相同输入的随机函数。在这里,做:
set.seed(123)
# how about 100 trials?
replicate(100, MC(1,1))
[1] 0.05039524 0.05369823 0.07158708 0.05670508 0.05729288 0.07315065 0.06060916
[8] 0.04334939 0.04913147 0.05154338 0.06824082 0.05959814 0.06000771 0.05710683
[15] 0.05044159 0.07386913 0.06097850 0.03633383 0.06301356 0.05127209 0.04532176
[22] 0.05382025 0.04573996 0.04871109 0.04974961 0.03913307 0.06437787 0.05753373
[29] 0.04461863 0.06853815 0.06026464 0.05304929 0.06495126 0.06478133 0.06421581
[36] 0.06288640 0.06153918 0.05538088 0.05294037 0.05219529 0.04905293 0.05392083
[43] 0.04334604 0.07768956 0.06807962 0.04476891 0.05197115 0.05133345 0.06379965
[50] 0.05516631 0.05853319 0.05571453 0.05557130 0.06968602 0.05374229 0.07116471
[57] 0.04051247 0.06184614 0.05723854 0.05815942 0.05979639 0.05097677 0.05266793
[64] 0.04581425 0.04528209 0.05903529 0.06048210 0.05653004 0.06522267 0.07650085
[71] 0.05108969 0.03290831 0.06605739 0.04890799 0.04911991 0.06625571 0.05315227
[78] 0.04379282 0.05781303 0.05461109 0.05605764 0.05985280 0.05229340 0.06244377
[85] 0.05379513 0.05931782 0.06696839 0.06035181 0.05274068 0.06748808 0.06593504
[92] 0.06148397 0.05838732 0.04972094 0.06960652 0.04999740 0.07787333 0.07132611
[99] 0.05364300 0.04573579
如果 MC
的全部目的是 运行 这个 monte carlo 模拟(顾名思义),那么您可以重写函数以接受 n
如果需要的话,像这样争论:
MC <- function(PV, t, n = 1, ...){
i <- rnorm(n, .056, .01)
FV <- PV*exp(i*t)
log(FV/PV)
}
set.seed(123)
MC(1, 1, n = 100)
# With the same seed it returns the same result as above, but more efficiently
然后你可以取 m
n
大小的样本并将它们放入数组中,使用新的 MC
函数,计算每个样本的标准差,然后绘制直方图
m <- 100
n <- 10
set.seed(123)
samples <- replicate(m, MC(1, 1, n))
sds <- apply(samples, 2, sd)
hist(sds)
我是 R 的完全新手,但真的很想"learn by doing",所以请原谅我的简单问题。
我有以下代码:
MC <- function(PV, t,...){
i <- rnorm(1, .056, .01)
FV <- PV*exp(i*t)
r <- log(FV/PV)
}
MC(1,1)
我需要多次迭代该函数,为 r 提供许多不同的值。然后我需要找到所有结果的标准偏差(也许将它们绘制成直方图?)。我曾尝试使用在线指南编写循环,但似乎找不到任何特定于我的问题的内容。我似乎总是以创建一个无限循环而告终,而且似乎无法编写有效的中断命令。
我确定我缺少一些基本的东西,但对于我来说,我似乎无法解决它。
您可以在函数中使用不同的 PV 和 t 值以及 return r 值进行迭代(循环)。为 r 使用一些阈值可以打破循环。
MC <- function(PV, t){
i <- rnorm(1, .056, .01)
FV <- PV*exp(i*t)
r <- log(FV/PV)
print(r)
return(r)
}
for (PV in 1:10){
for (t in 2:9){
th = MC(PV,t)
if(th>0.2){
break
}
}
}
首先,您的函数需要 return 一些东西。现在它正在为您无法访问的环境中的变量设置一个值。我建议:
MC <- function(PV, t,...){
i <- rnorm(1, .056, .01)
FV <- PV*exp(i*t)
log(FV/PV)
}
replicate()
函数旨在重复评估具有相同输入的随机函数。在这里,做:
set.seed(123)
# how about 100 trials?
replicate(100, MC(1,1))
[1] 0.05039524 0.05369823 0.07158708 0.05670508 0.05729288 0.07315065 0.06060916
[8] 0.04334939 0.04913147 0.05154338 0.06824082 0.05959814 0.06000771 0.05710683
[15] 0.05044159 0.07386913 0.06097850 0.03633383 0.06301356 0.05127209 0.04532176
[22] 0.05382025 0.04573996 0.04871109 0.04974961 0.03913307 0.06437787 0.05753373
[29] 0.04461863 0.06853815 0.06026464 0.05304929 0.06495126 0.06478133 0.06421581
[36] 0.06288640 0.06153918 0.05538088 0.05294037 0.05219529 0.04905293 0.05392083
[43] 0.04334604 0.07768956 0.06807962 0.04476891 0.05197115 0.05133345 0.06379965
[50] 0.05516631 0.05853319 0.05571453 0.05557130 0.06968602 0.05374229 0.07116471
[57] 0.04051247 0.06184614 0.05723854 0.05815942 0.05979639 0.05097677 0.05266793
[64] 0.04581425 0.04528209 0.05903529 0.06048210 0.05653004 0.06522267 0.07650085
[71] 0.05108969 0.03290831 0.06605739 0.04890799 0.04911991 0.06625571 0.05315227
[78] 0.04379282 0.05781303 0.05461109 0.05605764 0.05985280 0.05229340 0.06244377
[85] 0.05379513 0.05931782 0.06696839 0.06035181 0.05274068 0.06748808 0.06593504
[92] 0.06148397 0.05838732 0.04972094 0.06960652 0.04999740 0.07787333 0.07132611
[99] 0.05364300 0.04573579
如果 MC
的全部目的是 运行 这个 monte carlo 模拟(顾名思义),那么您可以重写函数以接受 n
如果需要的话,像这样争论:
MC <- function(PV, t, n = 1, ...){
i <- rnorm(n, .056, .01)
FV <- PV*exp(i*t)
log(FV/PV)
}
set.seed(123)
MC(1, 1, n = 100)
# With the same seed it returns the same result as above, but more efficiently
然后你可以取 m
n
大小的样本并将它们放入数组中,使用新的 MC
函数,计算每个样本的标准差,然后绘制直方图
m <- 100
n <- 10
set.seed(123)
samples <- replicate(m, MC(1, 1, n))
sds <- apply(samples, 2, sd)
hist(sds)