Julia,将数组的选定元素转换为具有二项式频率的新数字

问题描述

我试图独立选择满足条件的数组元素,然后将这些元素转换为不同的值,具有给定的频率。在 R 中,我会使用 rbinom,但在 Julia 中找不到正确的函数。 MWE:

#create array
a = [3,4,3,6,3];

# convert elements that match ==3 to 9
a[a .==3] .=9;

a
[9,9,9]

但我无法弄清楚如何进行二项式概率(可能是伯努利?)的转换,例如 0.66,因此转换后的 a 可能最终为

[3,9]

我认为我想要的是:

a[a .==3] .= bernoulli(0.66)9

这样从 3 转换到 9 的概率是 0.66。所以 66% 的时间它会将 3 转换为 9,而剩下的 33% 则将它保留为 3。有意义吗?

我想对 3 的每个实例独立进行评估,而不是提取所有 3 的索引向量,然后计算有多少个以概率转换(如果这有意义?!) Thx J

解决方法

我不知道这里有任何预先制定的解决方案(我真的不熟悉该领域),但您可以轻松推出自己的解决方案。

我认为您实际上应该使用伯努利分布,除非我弄错了。您可以使用 Distributions.jl 中的 Bernoulli,也可以使用普通的旧 rand 自行制作:

using Distributions: Bernoulli

function rbinom!(xs,subst::Pair,p=1.0)
    (x,y) = subst
    dist = Bernoulli(p)
    for (i,val) in pairs(xs)
        if val == x && rand(dist)
            xs[i] = y
        end
    end
    return xs
end

如果不想导入Distributions.jl,可以直接写

function rbinom!(xs,y) = subst
    for (i,val) in pairs(xs)
        if val == x && rand() < p  # or rand() <= p ?
            xs[i] = y
        end
    end
    return xs
end

你这样称呼它:

julia> a = [3,4,3,6,3];

julia> rbinom!(a,3=>9,0.66)
5-element Array{Int64,1}:
 9
 4
 9
 6
 3

请注意,此函数会就地更新向量 a。如果您不希望这样,您可以创建一个包装函数来发送 a 的副本:

rbinom(xs,args...) = rbinom!(copy(xs),args...)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...