首页 > 解决方案 > 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,4,9,6,9]

但我不知道该怎么做是用二项式概率(可能是伯努利?)的转换,例如,0.66 所以转换a后可能最终为

[3,4,9,6,9]

我想我想要的是这样的:

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

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

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

标签: juliadistributionbinomial-cdf

解决方案


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

我认为您实际上应该使用伯努利分布,除非我弄错了。您可以使用BernoulliDistributions.jl,也可以使用普通的 old 制作自己的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, subst::Pair, p=1.0)
    (x, 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...)

推荐阅读