【问题标题】:Integration error using R to evaluate overlapping distributions使用 R 评估重叠分布的积分误差
【发布时间】:2016-01-14 04:33:28
【问题描述】:

这个问题是对原始线程 (https://stats.stackexchange.com/questions/12209/percentage-of-overlapping-regions-of-two-normal-distributions) 的跟进

我已经修改了上面线程中的原始代码来标记地块,但仅此而已。我遇到了与一组输入一起工作的代码问题,但不是另一组。作为一个 R 初学者,我只是在寻求帮助。

mu1 <- 5
sd1 <- 1

mu2 <- 3
sd2 <- .75

此数据集有效。

当我更改数字时,我遇到了一个问题:

mu1 <- .3439
sd1 <- .0005

mu2 <- .3420
sd2 <- .00075

显然有重叠,但积分不是计算。

当数字改变时,积分如何失败?我该如何补救?我在 xs 中没有足够的 x 点来计算积分吗?

完整代码如下:

min.f1f2 <- function(x, mu1, mu2, sd1, sd2) {
  f1 <- dnorm(x, mean=mu1, sd=sd1)
  f2 <- dnorm(x, mean=mu2, sd=sd2)
  pmin(f1, f2)
}


mu1 <- .3439
sd1 <- .0005

mu2 <- .3420
sd2 <- .00075

xs <- seq(min(mu1 - 3*sd1, mu2 - 3*sd2), max(mu1 + 3*sd1, mu2 + 3*sd2), .00001)
f1 <- dnorm(xs, mean=mu1, sd=sd1)
f2 <- dnorm(xs, mean=mu2, sd=sd2)

plot(xs, f1, type="l", ylim=c(0, max(f1,f2)), ylab="density")
lines(xs, f2, lty="dotted")
ys <- min.f1f2(xs, mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)
xs <- c(xs, xs[1])
ys <- c(ys, ys[1])
polygon(xs, ys, col="red")


### integrate to find % overlap
iP <- integrate(min.f1f2, -Inf, Inf, mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)
VaLue <- iP$value
VaLue <- sprintf("%.1f %%", 100*VaLue)

#percentage on plot (in middle of overlap.. half of ys height )
text(((mu2 + 3*sd2)+(mu1 - 3*sd1))/2, max(ys)/2, VaLue)
#label f1
text(mu1+sd1,max(f1),"HOLE")
#label f2
text(mu2+sd2,max(f2),"PEG")

【问题讨论】:

  • 您在断言“孔”和“针”可以具有“正态分布”的地方迷失了方向。从理论上讲,这是不可能的——两者都不能有负半径——所以显然你正在做一些近似。您能否编辑此问题以明确说明您如何参数化这些几何对象以及如何使用正态分布对这些参数进行建模?
  • 公平。目的是说孔的内径具有平均值和公差。销的外径也是如此。因此,如果我的孔的公差为 0.3439±0.0015,我假设公差基于 3 sigma,因此标准偏差为 0.0005。我已经更新了我的第一个示例,这样孔或销就不会变成负数(很好!)。还添加了 cmets 以显示从库存中提取“可接受”零件的意图 - 目标是查看任何仅根据规格不适合的可接受零件的可能性。
  • 这可能有助于认识到这种重叠积分与销是否足够小以适合孔的问题无关。如果您要消除问题中的这种转移,我怀疑大多数读者会立即意识到您需要做什么。
  • 谢谢。我会清理我的问题以匹配。
  • 您似乎已经抛出了问题的所有统计元素。它现在询问“为什么这段代码似乎不起作用”。如果这确实是您想问的——知道它不能正确回答早期版本和 cmets 中提出的统计问题——那么请将其标记为迁移到 SO。

标签: r statistics normal-distribution integral


【解决方案1】:

我发现,无论出于何种原因,当接近无穷大时(甚至远高于或低于 3 sigma 尾……),对于小数的积分都会失败。

我只更新了从 -inf, inf 到 min(mu1 - 3*sd1, mu2 - 3*sd2), max(mu1 + 3*sd1, mu2 + 3*sd2) 的积分限制,我有一个再次近似。当然,它并不完美,但我真的只关心我的应用程序的少数数字。

真的很想更好地理解为什么当只是规模发生变化时这首先失败了。有什么想法吗?

以下更新代码。

min.f1f2 <- function(x, mu1, mu2, sd1, sd2) {
  f1 <- dnorm(x, mean=mu1, sd=sd1)
  f2 <- dnorm(x, mean=mu2, sd=sd2)
  pmin(f1, f2)
}

#HOLE 
mu1 <- .3439
sd1 <- .0005
#Peg
mu2 <- .3420
sd2 <- .00075

xs <- seq(min(mu1 - 3*sd1, mu2 - 3*sd2), max(mu1 + 3*sd1, mu2 + 3*sd2), .00001)
f1 <- dnorm(xs, mean=mu1, sd=sd1)
f2 <- dnorm(xs, mean=mu2, sd=sd2)

plot(xs, f1, type="l", ylim=c(0, max(f1,f2)), ylab="density")
lines(xs, f2, lty="dotted")
ys <- min.f1f2(xs, mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)
xs <- c(xs, xs[1])
ys <- c(ys, ys[1])
polygon(xs, ys, col="red")


### integrate to find % overlap
iP <- integrate(min.f1f2, min(mu1 - 3*sd1, mu2 - 3*sd2), max(mu1 + 3*sd1, mu2 + 3*sd2), mu1=mu1, mu2=mu2, sd1=sd1, sd2=sd2)
VaLue <- iP$value
VaLue <- sprintf("%.1f %%", 100*VaLue)

#percentage on plot (in middle of overlap.. )
text(((mu2 + 3*sd2)+(mu1 - 3*sd1))/2, max(ys)/3.5, VaLue)
#label f1
text(mu1+sd1,max(f1),"HOLE")
#label f2
text(mu2+sd2,max(f2),"PEG")

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 2021-07-07
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2019-10-24
    • 2017-12-22
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多