在R中估计概率分布

问题描述 投票:0回答:1

我计划做一个实验来确定一个二元变量(值为1或0)的频率。

每天有10,000个新事件发生。

每天,我可以从新的一万人中随机抽出100人,看看他们的结果(不是1就是0

如何用这个数据估计人口中1和0的频率?

R中是否有一个软件包可以对这些数据进行离散概率分布拟合?

r distribution sampling chi-squared
1个回答
1
投票

假设你有一个大小为N=10,000的人口,其中一天发生了6,500个事件。

pop <- rep(c(0,1), times=c(3500, 6500))
table(pop)
#pop
#   0    1 
#3500 6500

现在假设你可以从这些(0,1)事件中抽取100个样本。无人问津.

set.seed(123)
N <- 10000
n <- 100
sam <- data.frame(id=1:n, event=sample(pop, size=n), prob=n/N)

table(sam$event)
# 0  1 
#30 70

所以我们得到了100个中的70个。人口中总事件的最大似然估计值是简单的70100×10000=7000。这个估计的标准误差由以下公式给出

sqrt((N-n)/N * N^2 * var(sam$event)/n)
#[1] 473.71

95%的置信区间是[6101 - 7898],涵盖了真实的人口总数6500人。但20天中有1天你很可能会得到一个坏的样本。

R包?对于这个实验来说,其实没有必要。对于更复杂的抽样设计,我只能想到的是 调查 包,但可能还有其他的。


现在,如果你重复这样做,比如说10天,你会得到每一天的估计值。根据频繁主义统计学家的说法,对总量的估计是总量×N n,对SE的估计也是以类似的方式计算。例如,假设你在连续十天从100个样本中发现了3、4、5、11、6、8、14、8、17和19个 "积极 "事件。

events1 <- c(3, 4, 5, 11, 6, 8, 14, 8, 17, 19)

这意味着 "阴性 "或非事件的发生是:

events0 <- 100 - events1

(0,1)事件的向量可以用以下方法构造: rep.

events <- rep(rep(c(0,1), each=10), times=c(events0, events1))

让我们将n和N分别定义为你的十天样本和十天人群中的事件数量。

n <- 100 * 10
N <- 10000 * 10

在您的十天样本中,"阳性 "事件的数量是:。

sum(events1)
#[1] 95

而十天人口中的MLE是:

(T <- sum(events1) * N / n)
[1] 9500

这十天估计的标准误差是:

SE <- sqrt((N-n)/N * N^2 * var(events)/n); SE
[1] 923.0409

有95%的CI值

T + c(-1,1) * 1.96*SE
[1]  7690.84 11309.16

贝叶斯学者可能会说,每一天都应该根据前一天的估计值进行重新估计或更新,但我认为结果会相当相似。


贝叶斯法则会使用贝叶斯法则,并使用Uniform(0,1)作为合理的 在先 十天内 "正 "事件比例的分布。Unif(0,1)与Beta(1,1)相同。一个有经验的统计学家(频数学家或贝叶斯学家)会认识到贝塔分布为 共轭 的二项分布。因此,贝叶斯人将使用Beta(1+X,1+N-X)分布来计算十天内 "阳性 "事件的比例,其中X是 "阳性 "事件的总数(95),N是样本量(1000)。注意,Beta(alpha,beta)的平均值=alpha(alpha+beta)。

在R中。

n <- rep(100, 10)
events1 <- c(3, 4, 5, 11, 6, 8, 14, 8, 17, 19)

X <- sum(events1)
N <- sum(n)

pmean = (1+X)/(2+N); pmean
#[1] 0.09580838

CI = qbeta(c(.025,.975), 1+X, 1+N-X); CI # 95% credible interval
#[1] 0.07837295 0.11477134

因此,在十天的时间里,阳性事件的比例是所有事件的9.58% 而95%的概率是真实比例在7.84%和11.48%之间。以總人口推算,我們可以說,在10萬個事件中,9.58%或9,581個事件是正面的。正如我所说,这与频繁主义的方法非常相似。

元分析

现在,这两种方法实际上是把所有的十天都合并成一个大样本,估计阳性事件的比例,或者阳性事件的总数,在整个人群中的比例。更直观的做法可能是将每一天的结果以更合适的方式结合起来,基于权重,比如在荟萃分析中的做法。

如果p[k]是第k天的估计比例,se[k]是它的标准误差,那么合并后的估计结果由p_hat = sum(p[k] * w[k]) sum(w[k])给出,其中w[k] = (1 se[k])^2,标准误差为1 sqrt(sum(w[k])。

在R中。

N <- rep(100000, 10) # Population and 10 day period
n <- rep(100, 10) 

events1 <- c(3, 4, 5, 11, 6, 8, 14, 8, 17, 19)
events0 <- n - events1

p <- NULL; SE <- NULL; w <- NULL

for(k in seq_along(events1)){
  events <- c(rep(0, events0[k]), rep(1, events1[k]))
  p[k] <- sum(events1[k]) / n[k]
  SE[k] <- sqrt((N[k]-n[k]) / N[k] * var(events)/n[k])
  w[k] <- 1 / (SE[k])^2
}

p_hat <- sum(p*w)/sum(w); p_hat
#[1] 0.06997464

SE_p <- 1 / sqrt(sum(w)); SE_p
#[1] 0.007943816

(p_hat + c(-1,1) * 1.96 * SE_p)
#[1] 0.05440476 0.08554452

因此,在95%的置信区间(5.44%-8.55%)下,大约7%的事件是阳性的,这与上述两种粗略的方法没有太大区别。由于十天样本的偏斜性,我们得到的估计值较小(也许更准确)。

© www.soinside.com 2019 - 2024. All rights reserved.