在 Excel 的 NORMINV() 上随着样本量的增加而增加平均偏差
Increasing mean deviation with increasing sample size on Excel's NORMINV()
我在尝试用 C 编写 Excel 的 NORMINV() 时有一个奇怪的行为。作为 norminv() 我从数学家那里得到了 this 函数,这可能是正确的,因为我也尝试不同的结果相同。这是代码:
double calculate_probability(double x0, double x1)
{
return x0 + (x1 - x0) * rand() / ((double)RAND_MAX);
}
int main() {
long double probability = 0.0;
long double mean = 0.0;
long double stddev = 0.001;
long double change_percentage = 0.0;
long double current_price = 100.0;
srand(time(0));
int runs = 0;
long double prob_sum = 0.0;
long double price_sum = 0.0;
while (runs < 100000)
{
probability = calculate_probability(0.00001, 0.99999);
change_percentage = mean + stddev * norminv(probability); //norminv(p, mu, sigma) = mu + sigma * norminv(p)
current_price = current_price * (1.0 + change_percentage);
runs++;
prob_sum += probability;
price_sum += current_price;
}
printf("\n\n%f %f\n", price_sum / runs, prob_sum / runs);
return 0;
}
现在我想模拟 Excel 的 NORMINV(rand(), 0, 0.001),其中 rand() 是一个 > 0 且 < 1 的值,0 是平均值,0.001 是标准值偏差.
1000 个值看起来没问题:
100.729780 0.501135
对于 10000 个值,它传播得太多了:
107.781909 0.502301
如果有 100000 个值,它有时会传播得更多:
87.876500 0.498738
现在我不知道为什么会这样。我的假设是随机数生成器也必须呈正态分布。在我的例子中,probability
计算得很好,因为平均值几乎一直是 0.5。因此我不知道为什么平均偏差在增加。有人可以帮助我吗?
您正在按照 random walk 的方式进行操作,只是您的动作是乘法比例因子而不是加法步骤。
考虑两个连续的动作,第一个给出 20% inflation,第二个给出 20% 的紧缩。从 100 的基线开始,在第一步之后你是 120。如果你现在取 120 的 80%,你将得到 96 而不是原来的 100。换句话说,看似对称的比例因子实际上并不对称。虽然您的比例因子是随机的,但它们仍然是围绕 1 对称创建的,所以看到偏差累积我并不感到惊讶。
我在尝试用 C 编写 Excel 的 NORMINV() 时有一个奇怪的行为。作为 norminv() 我从数学家那里得到了 this 函数,这可能是正确的,因为我也尝试不同的结果相同。这是代码:
double calculate_probability(double x0, double x1)
{
return x0 + (x1 - x0) * rand() / ((double)RAND_MAX);
}
int main() {
long double probability = 0.0;
long double mean = 0.0;
long double stddev = 0.001;
long double change_percentage = 0.0;
long double current_price = 100.0;
srand(time(0));
int runs = 0;
long double prob_sum = 0.0;
long double price_sum = 0.0;
while (runs < 100000)
{
probability = calculate_probability(0.00001, 0.99999);
change_percentage = mean + stddev * norminv(probability); //norminv(p, mu, sigma) = mu + sigma * norminv(p)
current_price = current_price * (1.0 + change_percentage);
runs++;
prob_sum += probability;
price_sum += current_price;
}
printf("\n\n%f %f\n", price_sum / runs, prob_sum / runs);
return 0;
}
现在我想模拟 Excel 的 NORMINV(rand(), 0, 0.001),其中 rand() 是一个 > 0 且 < 1 的值,0 是平均值,0.001 是标准值偏差.
1000 个值看起来没问题:
100.729780 0.501135
对于 10000 个值,它传播得太多了:
107.781909 0.502301
如果有 100000 个值,它有时会传播得更多:
87.876500 0.498738
现在我不知道为什么会这样。我的假设是随机数生成器也必须呈正态分布。在我的例子中,probability
计算得很好,因为平均值几乎一直是 0.5。因此我不知道为什么平均偏差在增加。有人可以帮助我吗?
您正在按照 random walk 的方式进行操作,只是您的动作是乘法比例因子而不是加法步骤。
考虑两个连续的动作,第一个给出 20% inflation,第二个给出 20% 的紧缩。从 100 的基线开始,在第一步之后你是 120。如果你现在取 120 的 80%,你将得到 96 而不是原来的 100。换句话说,看似对称的比例因子实际上并不对称。虽然您的比例因子是随机的,但它们仍然是围绕 1 对称创建的,所以看到偏差累积我并不感到惊讶。