如何 select 数值向量的随机子集具有特定的方差?
How to select a random subset of a numeric vector to have a specific variance?
我有一个长度为 10000 的数字向量。总方差为 0.90。我想选择这个向量的一个随机子集,它可以是任意长度但应该有 0.85 的方差。当然,我可以通过按升序对向量进行排序并逐渐从分布的两端移除元素,直到获得所需的方差。但这不会是随机的 selection。我想随机 select 个人。
更新:正如 G5W 指出的那样,select使一个子集具有特定方差并不是随机的。我想知道是否有非随机抽样方法来选择具有特定方差的子集。
我们可以使用迭代方法以(某种)随机方式实现这一点。
让我们取一个包含 10000 个元素且方差恰好为 0.9 的起始向量:
set.seed(123)
vec <- rnorm(10000, 0, sqrt(0.9024591))
var(vec)
#> [1] 0.9
现在,如果我们想对向量进行随机子集化,使其具有 0.85 的方差,我们可以 select 随机取一个值,并在移除它时检查方差是否下降。如果不是,我们将其保存在我们的向量中并再次采样。如果方差下降,我们从向量中删除该项目。我们一直重复这个直到方差下降到 0.85:
v <- vec
while(var(v) > 0.85)
{
var_v <- var(v)
i <- sample(length(v), 1)
if(var(v[-i] < var_v)) v <- v[-1]
}
var(v)
#> [1] 0.8476715
length(v)
#> [1] 343
我们可以通过在方差低于阈值时进行备份并删除方差最接近 0.85 的任何单个值来使它更接近 0.85。归结为随机性还是接近 0.85 是您的优先事项
由 reprex package (v0.3.0)
于 2020-07-11 创建
我有一个长度为 10000 的数字向量。总方差为 0.90。我想选择这个向量的一个随机子集,它可以是任意长度但应该有 0.85 的方差。当然,我可以通过按升序对向量进行排序并逐渐从分布的两端移除元素,直到获得所需的方差。但这不会是随机的 selection。我想随机 select 个人。
更新:正如 G5W 指出的那样,select使一个子集具有特定方差并不是随机的。我想知道是否有非随机抽样方法来选择具有特定方差的子集。
我们可以使用迭代方法以(某种)随机方式实现这一点。
让我们取一个包含 10000 个元素且方差恰好为 0.9 的起始向量:
set.seed(123)
vec <- rnorm(10000, 0, sqrt(0.9024591))
var(vec)
#> [1] 0.9
现在,如果我们想对向量进行随机子集化,使其具有 0.85 的方差,我们可以 select 随机取一个值,并在移除它时检查方差是否下降。如果不是,我们将其保存在我们的向量中并再次采样。如果方差下降,我们从向量中删除该项目。我们一直重复这个直到方差下降到 0.85:
v <- vec
while(var(v) > 0.85)
{
var_v <- var(v)
i <- sample(length(v), 1)
if(var(v[-i] < var_v)) v <- v[-1]
}
var(v)
#> [1] 0.8476715
length(v)
#> [1] 343
我们可以通过在方差低于阈值时进行备份并删除方差最接近 0.85 的任何单个值来使它更接近 0.85。归结为随机性还是接近 0.85 是您的优先事项
由 reprex package (v0.3.0)
于 2020-07-11 创建