如何在假定点为10,000和100,000次的情况下实现代码实现。这样模拟才能正确执行?
using Statistics, Random, DataFrames, DataFramesMeta, CSV, PyPlot
macro assertprob(x)
msg = string("wrong ", x, ": ")
:(0≤$(esc(x))≤1 || throw(ArgumentError(string($msg,$(esc(x))))))
end
function simulate(p::Float64, q::Float64)
@assertprob p
@assertprob q
@assertprob p+q
t = 0
while true
t += 1
r = rand()
r < p && return t
r < p + q && return missing
end
end
function getpoint()
while true
p, q = rand(), rand()
p + q ≤ 1 && return (p, q)
end
end
function runsim(points=10^3, reps=10^3)
df = DataFrame(p=Float64[], q=Float64[], rep=Int[],
sim=Union{Int,Missing}[])
for i in 1:points
p, q = getpoint()
for j in 1:reps
push!(df, (p, q, j, simulate(p, q)))
end
end
df
end
function analyzesim(df)
@linq df |>
by([:p, :q], msim=mean(collect(skipmissing(:sim)))) |>
transform(mtheory=1 ./ (:p .+ :q)) |>
with(scatter(:msim, :mtheory))
end
Random.seed!(1)
df = runsim()
CSV.write("results.txt", df)
analyzesim(df)
有人有想法吗? 预先感谢您的帮助?
答案 0 :(得分:0)
虽然我非常同意以上评论(此论坛不是代码审查的地方,并且您的问题措辞不佳),但对于Snows来说却是艰难的生活。
我将尝试解决“实施模拟正确执行的(伪?)代码[s] o”的问题,但是由于该代码可以运行,因此我们可以查看其他可能的问题。但是,这一切都取决于我对您要实现的蒙特卡洛值
的理解。simulate
,missing
返回一个p > r < p+q < 1
。如果那是不正确的情况,请重复实验,而不要返回丢失的内容。特别是因为您丢掉了失物。 simulate
返回missing
或Float64
。此类型不稳定,因此不受欢迎。df
。这也是对性能的影响,应该预先分配。p
和q
分别存储在两个长度为npoints
的向量中,并且t
中的结果simulate
在reps
的矩阵中{ {1}}然后沿第一个维度(沿npoints
进行平均)最后,可以做很多数学运算来提高性能。
reps
和p
从L1规范球的第一象限均匀地绘制。
换句话说,如果任何一对q
在该区域中,则其概率为1。
只需一点数学即可得出边际密度和累积概率函数,如:(p, q)
和f(p) = 2(1-p)
。 (已完成数学运算以使其标准化)。因此,您可以通过首先绘制F(p) = p*(2-p)
并求解p
来绘制随机u = rand()
。然后绘制随机的u = 2p - p^2
。
最后,如果我正确理解了模拟,则您正在计算获得q = (1-p)*rand()
的预期尝试次数,但是如果为r = rand() < p
,则会降低预期。
但是,该代码仅计算逃脱p < r < p+q
区域所需的尝试次数,而不是如果最终样本位于[p+q, 1]
区域的中间,则因为该代码会丢弃所有(p, p+q)
和不会查看多少个重复等于missing
(平均missing
)。这意味着数据不是随机丢失的,而是以概率q/(p+q)*reps
丢失的,这会使q/(p+q)
的估计值偏离(p,q )支持。
另外,非缺失样本的数量也因此估计t
的方差也取决于t
,引入了对数据进行拟合优度或p值统计的其他考虑因素< / p>
实际上,我很高兴我用笔和纸坐下来思考了一下。计算需要降落到q
而不是[0, p]
([p, p+q]
)的样本数量的数学很有趣,我花了一些时间思考为什么p/(p+q)^2
是关于msim
。
我希望这会有所帮助!