修改代码以改善仿真

时间:2019-02-02 07:33:53

标签: julia simulation implementation

如何在假定点为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)

有人有想法吗? 预先感谢您的帮助?

1 个答案:

答案 0 :(得分:0)

虽然我非常同意以上评论(此论坛不是代码审查的地方,并且您的问题措辞不佳),但对于Snows来说却是艰难的生活。

我将尝试解决“实施模拟正确执行的(伪?)代码[s] o”的问题,但是由于该代码可以运行,因此我们可以查看其他可能的问题。但是,这一切都取决于我对您要实现的蒙特卡洛值

的理解。
    如果simulate
  1. missing返回一个p > r < p+q < 1。如果那是不正确的情况,请重复实验,而不要返回丢失的内容。特别是因为您丢掉了失物。
  2. simulate返回missingFloat64。此类型不稳定,因此不受欢迎。
  3. 类似地,代码会动态增长df。这也是对性能的影响,应该预先分配。
  4. 我不确定实际上是否需要DataFrame。该代码可以将pq分别存储在两个长度为npoints的向量中,并且t中的结果simulatereps的矩阵中{ {1}}然后沿第一个维度(沿npoints进行平均)

最后,可以做很多数学运算来提高性能。 repsp从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

我希望这会有所帮助!