如何实现代码执行假设点是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)
没有任何人有一个想法?预先感谢您的帮助 ?
虽然我极力上述意见同意(这个论坛是不是代码审查的地方,你的问题是措辞不当),它是斯诺一生坎坷。
生病试图解决这个问题:“落实(伪?)码[S] O,模拟正确执行”,但由于代码运行,我们可以看看其他可能的问题。然而,这一切都取决于我的价值是什么,你的理解正在试图蒙特卡罗
simulate
返回missing
如果p > r < p+q < 1
。如果这是一个不正确的情况下,可能重复实验,而返回的缺失。特别是因为你正在下降missings。simulate
返回无论是missing
或Float64
。这不是键入稳定,而不是优先。df
。这也是影响性能,应预先分配。p
和q
每个在两个矢量npoints
长,并从t
在由simulate
然后沿所述第一维度的平均矩阵reps
结果npoints
(沿reps
)最后,还有大量的数学可以做,以加快性能。 p
和q
从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)
。
我希望这有帮助!