【问题标题】:Estimate Probability distribution in R估计 R 中的概率分布
【发布时间】:2020-04-26 08:00:47
【问题描述】:

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

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

每天,我都会从新的 10,000 个中随机抽取 100 个并查看它们的结果(1 或 0)

如何使用这些数据估计总体中 1 和 0 的频率?

R 中是否有可以将离散概率分布拟合到此数据的包?

【问题讨论】:

  • 看起来您正在寻找最大似然估计
  • 除非您有很多天,否则几乎不需要估计此人群中的频率。您可以简单地每天学习所有 10,000 个。有些人绕着脑袋转有点奇怪,但是当你有一个人口时,就不需要估计它的任何参数了。你已经有了参数。例如,在我的笔记本电脑上 a
  • 在这种情况下,我无法每天测量所有 10,000 个。我们的能力有限,因此实际上每天只能测量 100 个观测值。

标签: r distribution sampling chi-squared


【解决方案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 个。总体中事件总数的最大似然估计是 70/100 x 10,000 = 7,000。此估计的标准误差由

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

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

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


现在,如果您反复执行此操作,例如 10 天,您将获得每天的估算值。根据一位常客统计学家的说法,对总数的估计将是总数 x N / n 和以类似方式计算的 SE 的估计。例如,假设您连续 10 天从 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

可以使用rep 构造如下的 (0,1) 事件向量。

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

让我们将 n 和 N 分别定义为您的 10 天样本和 10 天总体中的事件数。

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) 相同。有经验的统计学家(Frequentist 或 Bayesian)会认识到 beta 分布与二项分布共轭。因此,贝叶斯将使用 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%,真实比例在 7.84% 和 11.48% 之间的概率为 95%。外推到总人口,我们可以说 100,000 个事件或 9,581 个事件中有 9.58% 是积极的。正如我所说,这与频率论方法非常相似。

元分析

现在,这两种方法有效地将所有十天组合成一个大样本,并估计阳性事件在整个人群中的比例,或阳性事件的总数。基于权重以更合适的方式组合每天的结果可能更直观,例如在元分析中所做的。

如果 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

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

【讨论】:

  • 假设我有 10 个样本,每个样本 100 个。总体中所有事件的最大可能性是多少?假设我收集了 (3, 4, 5, 11, 6, 8, 14, 8, 17, 19) 的值。我会将所有值相加并查看它们的频率吗?因此,如果总和为 95,每个样本为 100,那么十天内即为 1000。 ((95/1000)*10,000*10) 是 10 天内总体事件的 MLE?我将如何确定此估计的 SE 和 95% CI?
  • 是的 - 我认为这听起来不错。有关 SE 和 95% CI 的计算,请参阅更新的答案。我想知道相关数据是否会成为这里的问题。只要每一天都独立于下一天,那么也许就没有问题。但是您没有提供任何上下文。
  • 在这种情况下,可以假设观察是独立的。变量“死亡”是否与 T 相同? SE
  • 我可以将底层分布描述为二项分布吗?
  • 对不起 - died 应该是 events。我已经更正了。
猜你喜欢
  • 2017-11-20
  • 1970-01-01
  • 2017-03-01
  • 2023-04-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2014-01-17
  • 2014-08-11
相关资源
最近更新 更多