gpt4 book ai didi

减少 R 中向量元素的总和

转载 作者:行者123 更新时间:2023-12-04 22:54:54 27 4
gpt4 key购买 nike

在 R 中,我有一个整数向量。从这个向量中,我想随机减少每个整数元素的值,以获得向量的总和,即初始总和的百分比。

在这个例子中,我想将向量“x”减少到向量“y”,其中每个元素都被随机减少以获得等于初始总和的 50% 的元素总和。

结果向量的值应为非负且低于原始值。

set.seed(1)
perc<-50
x<-sample(1:5,10,replace=TRUE)
xsum<-sum(x) # sum is 33
toremove<-floor(xsum*perc*0.01)
x # 2 2 3 5 2 5 5 4 4 1

y<-magicfunction(x,perc)
y # 0 2 1 4 0 3 2 1 2 1
sum(y) # sum is 16 (rounded half of 33)

你能想出办法吗?谢谢!

最佳答案

假设 x足够长,我们可以依靠一些适当的大数定律(还假设 x 在某些其他方面足够规则)。为此,我们将生成另一个随机变量 Z 的值,取值在 [0,1] 中,平均值为 perc .

set.seed(1)
perc <- 50 / 100
x <- sample(1:10000, 1000)
sum(x)
# [1] 5014161
x <- round(x * rbeta(length(x), perc / 3 / (1 - perc), 1 / 3))
sum(x)
# [1] 2550901
sum(x) * 2
# [1] 5101802
sum(x) * 2 / 5014161
# [1] 1.017479 # One percent deviation

这里对于 Z 我选择了一个特定的 beta 分布,给出平均值 perc ,但你也可以选择其他一些。方差越小,结果越精确。例如,由于先前选择的 beta 分布实际上是双峰的,因此以下情况要好得多:
set.seed(1)
perc <- 50 / 100
x <- sample(1:1000, 100)
sum(x)
# [1] 49921
x <- round(x * rbeta(length(x), 100 * perc / (1 - perc), 100))
sum(x)
# [1] 24851
sum(x) * 2
# [1] 49702
sum(x) * 2 / 49921
# [1] 0.9956131 # Less than 0.5% deviation!

关于减少 R 中向量元素的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53397861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com