如何生成给定平均值的一系列特定数字?

时间:2018-11-08 21:01:07

标签: r

给出指定值的向量,例如:

x = c(4.0, 3.7, 3.3, 3.0, 2.7, 2.3, 2.0, 1.7, 1.3, 1.0)

我想创建一个任意长度的新向量,该向量仅包含随机采样的x中的值,这将得出3.15的组合均值。我尝试使用rnorm()函数,但是,我只能生成等于3.15平均值的随机数,而不是我想要的指定值。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:3)

您的问题是,有无数种采样方式

x = c(4.0, 3.7, 3.3, 3.0, 2.7, 2.3, 2.0, 1.7, 1.3, 1.0)

要获得大约3.15的平均值,您只需为每个值指定一个概率。

n = 20
sample(x, n, replace = TRUE)

假设每个值的可能性均等,并且您得到的平均值接近2.5。但是,如果您重新加权概率,则可以更接近所需的值。一种实现方式可能是

p = 1/(x - 3.15)^2    # or try p = 1/abs(x - 3.15)
sample(x, n, replace = TRUE, prob = p)

其中p权重的值接近3.15,因此更可能被接受。这不是完美的(意味着真实的期望值类似于3.12,而大多数值只是2.73.03.3),但是同样没有一个解决方案。

答案 1 :(得分:1)

这是我的蛮力方法:

[user@ckanserverckan]$ ls -l
drwxr-xr-x. 2 apache apache 4096 Nov 8 23:45 resources
drwxr-xr-x. 2 apache apache 4096 Nov 8 23:57 storage

现在,每次您执行samp315<-function(n=20, desmean=3.15, distance=0.001) { # create a function with default n=20 and range 3.149-3.151 x<- c(4.0, 3.7, 3.3, 3.0, 2.7, 2.3, 2.0, 1.7, 1.3, 1.0) samp<-0 # reset samp to 0 i<-0 # reset my counter to zero while (!between(mean(samp),desmean-distance,desmean+distance) & i<1000000) { # the following will run continuously until a sample (samp) with a mean that falls within the specified range is found, OR until 1 million attempts have been made samp<-sample(x,n,replace=TRUE) # try to generate a sample of n times from the list of values (x) i=i+1 # add to counter towards 1 million } ifelse(i<1000000,samp,warning("Couldn't find an appropriate sample, please select a lower n, a desired mean closer to 2.5, or a greater distance")) # if the while loop ended because the counter reached a million, exit with an error, otherwise, return the contents of samp. }

samp315()

如果您想要一个不同长度的样本,只需在eg<-samp315() mean(eg) [1] 3.15 eg [1] 3.0 3.7 3.0 3.7 3.3 3.7 3.3 3.3 4.0 1.0 1.7 3.0 2.0 4.0 3.7 3.7 2.3 3.3 4.0 3.3 内放入任意数字即可。但是,数字越大,找到可以达到所需均值的样本所需的时间就越长。

您还可以通过设置samp315()来更改所需的均值,并通过将desmean更改为与所需均值的距离(+/-)可以改变范围。默认值为n = 20,范围从3.149到3.151。

为避免n和range的极不可能组合的无限循环,我设置了最多1m个样本,此后该函数会退出并显示警告。

答案 2 :(得分:1)

正如@mickey所指出的,我们可以根据距均值的距离加权每个项目的概率。但是,这并不完全有效,因为x中的元素要少于期望的平均值,这会使采样偏向于它们。我们可以通过相对于高于或低于期望均值的多少个元素来调整概率来解决这个问题:

x = c(4.0, 3.7, 3.3, 3.0, 2.7, 2.3, 2.0, 1.7, 1.3, 1.0)
n = 100000
xbar=3.15

xhi = x[which(x>xbar)]
xlo = x[which(x<xbar)]
probhi = 1/(xhi-xbar)
problo = 1/(xbar-xlo)

probhi = probhi * length(problo) / length(probhi)

n=1e5
set.seed(1)
y = sample(x, size = n, replace = TRUE, prob = c(probhi,problo))
mean(y)
# [1] 3.150216