对钟形曲线进行逆向工程

Reverse Engineering a Bell Curve

提问人:stats_noob 提问时间:11/12/2023 最后编辑:stats_noob 更新时间:11/15/2023 访问量:96

问:

赏金将在 2 天后到期。这个问题的答案有资格获得 +50 声望赏金。stats_noob 正在寻找来自信誉良好的来源的答案
你好!我希望在 R 中创建一个函数,该函数可以修改钟形曲线,从而满足某些条件。有人可以告诉我如何做到这一点吗?谢谢!(注意:这是我 math.stackexchange.com/questions/4804927/ 最终目标......)

我模拟了以 50 为中心的正态分布中的数字,然后将数字保持在 0 到 100 之间:

mean <- 50
sd <- 15
n <- 100000

set.seed(123)  
numbers <- rnorm(n, mean, sd)

numbers <- pmax(0, pmin(numbers, 100))

正如预期的那样,结果看起来像钟形曲线:

enter image description here

然后,我想看看每个单位间隔之间的数字百分比:

min_interval <- seq(0, 99, by = 1)
max_interval <- seq(1, 100, by = 1)


count <- sapply(min_interval, function(x) {
    sum(numbers >= x & numbers < (x + 1))
})
percentage <- count / length(numbers) * 100

df <- data.frame(min_interval = min_interval,
                 max_interval = max_interval,
                 count = count,
                 percentage = percentage)

结果如下所示:

library(dplyr)
df %>% arrange(desc(percentage))

    min_interval max_interval count percentage
1             50           51  2714      2.714
2             48           49  2632      2.632
3             49           50  2628      2.628
4             52           53  2626      2.626
5             47           48  2615      2.615

#> sum(df$percentage)
#[1] 99.957

我的问题:假设我想对此结果表 (df) 进行以下更改,以便:

  • (min_interval = 50, max_interval = 51) 的百分比为 5%
  • (min_interval = 49, max_interval = 50) 的百分比为 5%
  • 百分比列的总和仍为 1
  • 该图仍然保持其近似形状

如何重新计算百分比列,以便满足这些条件?可以针对此问题编写通用函数吗?(例如,输入所需的约束条件,优化算法会找到相应的钟形曲线)

相关问题

r

评论


答:

5赞 pdb 11/12/2023 #1

你使用模拟来学习统计学真是太好了,这是一种令人愉快的学习方式。

该函数告诉您低于特定值的正态分布(有时也称为“钟形曲线”)的比例。您可以通过对两点之间的值进行差分来找到两点之间的正态分布的比例。例如,对于您的参数,49 到 50 之间的预期比例为pnormpnorm

pnorm(50,mean=50, sd=15) - pnorm(49, mean=50, sd=15)
# 0.02657646

或约2.657%,与模拟的2.628%相差不远。

要找到此范围内具有 5% 的正态分布,您可以创建一个函数,该函数是该范围内的比例

f1 <- function(x) {
  pnorm(50,mean=50,sd=x) - pnorm(49, mean=50, sd=x)
}
plot(x <- seq(0,10,len=100),f1(x), type="l")
# horizontal line at 0.05, or 5%
abline(0.05,0)

因此,您无法选择该物业所在的地块。

如果你想解决这个问题,请使用找到这个交叉点发生的地方。交叉是 when 为零,因此定义为optimizef1(x) - 0.05f2

f2 <- function(x) {
  abs(f1(x) - 0.05)
}

绝对值允许我们在唯一解下最小化函数

optimize(lower=5,upper=10,f=f2)
# $minimum
# [1] 7.957901
# 
# $objective
# [1] 3.038535e-08

这表明,如果将标准差设置为 7.956,则应获得 49 到 50 之间分布的 5% 左右。

评论

0赞 stats_noob 11/12/2023
@PDB:非常感谢您的回答!我最近对这个问题感到好奇......你认为你建议的方法是否适用于这些类型的问题 math.stackexchange.com/questions/4804927/...,即添加更多约束?
0赞 stats_noob 11/12/2023
早些时候,我尝试使用线性规划风格方法解决类似类型的问题:stackoverflow.com/questions/77464036/...