代码的修改,以提高仿真

问题描述 投票:0回答:1

如何实现代码执行假设点是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)

没有任何人有一个想法?预先感谢您的帮助 ?

julia simulation implementation
1个回答
0
投票

虽然我极力上述意见同意(这个论坛是不是代码审查的地方,你的问题是措辞不当),它是斯诺一生坎坷。

生病试图解决这个问题:“落实(伪?)码[S] O,模拟正确执行”,但由于代码运行,我们可以看看其他可能的问题。然而,这一切都取决于我的价值是什么,你的理解正在试图蒙特卡罗

  1. simulate返回missing如果p > r < p+q < 1。如果这是一个不正确的情况下,可能重复实验,而返回的缺失。特别是因为你正在下降missings。
  2. simulate返回无论是missingFloat64。这不是键入稳定,而不是优先。
  3. 类似地,代码动态增长df。这也是影响性能,应预先分配。
  4. 我不知道实际上是需要一个数据帧。该代码可以存储pq每个在两个矢量npoints长,并从t在由simulate然后沿所述第一维度的平均矩阵reps结果npoints(沿reps

最后,还有大量的数学可以做,以加快性能。 pq从L1范数球的第一象限均匀地拉伸。所述另一种方式,任何一对(p, q)的概率是1,如果它是在该区域中。

一个小的数学产生的边际密度和累积概率函数为: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),缺少这将偏压t的估计距离(P,Q)的支持的角部中的一个。此外,数关非缺失样品和因此的所述估计t的依附上q以及,引入额外的考虑因素方差为对数据运行配合或p值的统计的一个优度

我其实挺高兴我坐下来与纸笔通过觉得这。数学计算在[0, p]降落,但不[p, p+q]p/(p+q)^2)所需的样本数量很有趣,我花了一段时间来思考为什么msim是about1/(p+q)

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.