统计模拟结果中的奇怪条带
Weird banding in stats simulation results
所以我目前正在上统计学课程,我们一直在谈论抽样变化。我构建了一个执行采样模拟并显示结果的 Web 应用程序 (cobra5707.dx.am/SampleSim) 当我使用像 1000 这样的不错的样本量时,我得到了一个很好的正态分布。
0.45、1000、10000 的结果:
然而,当样本量不是一个很好的数字时,生成的直方图会出现奇怪的间隙。
0.45、808、10000 的结果:
代码没有最小化,所以你可以在开发工具中查看源代码,工作代码是:
onmessage = function(event) {
e = event.data;
var s = 0;
var p = e.true_value;
for(var i=0; i<e.sample_size; i++){
if(Math.random()<p)
s++;
}
postMessage(s/e.sample_size);
}
编辑 1:
所以这个过程是这样进行的,工作人员运行选定数量的模拟并计算成功模拟的比例和 returns 百分比 [0, 1]。这些百分比乘以 100,然后存储在数组中。最后,Plotly 根据数据生成直方图。直方图似乎没有错误,因为遍历数组确认空百分比范围内没有值。
编辑 2:仔细观察后,似乎是因为某些百分比根本不可能造成间隙,并且 xbin 大小足够小,这些间隙可见,所以我想我需要玩一下.很抱歉浪费了大家的时间,认为这可能是一些奇怪的浮点错误。
您似乎已经意识到,这是因为 Plotly 选择的自动选择的 bin 大小与您的数据不一致。
最简单的方法是 运行 样本大小为“3” - 只有四种可能的结果:0.0、33.33333333、66.66666667 和 100.0。
然而 Plotly 选择的 bins 是 -10 到 10、10 到 30、30 到 50、50 到 70、70 到 90 和 90 到 110。
解决方案是修改方法 UpdatePlot
以便它使用您的样本大小来确定 bin;像这样:
function UpdatePlot(data, args){
Plotly.deleteTraces("plot", 0);
Plotly.addTraces("plot",
{x:data, type:"histogram", autobinx: false,
xbins: {start: -50/ss, end: 100 + (50/ss), size: 100/ss}});
}
所以我目前正在上统计学课程,我们一直在谈论抽样变化。我构建了一个执行采样模拟并显示结果的 Web 应用程序 (cobra5707.dx.am/SampleSim) 当我使用像 1000 这样的不错的样本量时,我得到了一个很好的正态分布。
0.45、1000、10000 的结果:
然而,当样本量不是一个很好的数字时,生成的直方图会出现奇怪的间隙。
0.45、808、10000 的结果:
代码没有最小化,所以你可以在开发工具中查看源代码,工作代码是:
onmessage = function(event) {
e = event.data;
var s = 0;
var p = e.true_value;
for(var i=0; i<e.sample_size; i++){
if(Math.random()<p)
s++;
}
postMessage(s/e.sample_size);
}
编辑 1: 所以这个过程是这样进行的,工作人员运行选定数量的模拟并计算成功模拟的比例和 returns 百分比 [0, 1]。这些百分比乘以 100,然后存储在数组中。最后,Plotly 根据数据生成直方图。直方图似乎没有错误,因为遍历数组确认空百分比范围内没有值。
编辑 2:仔细观察后,似乎是因为某些百分比根本不可能造成间隙,并且 xbin 大小足够小,这些间隙可见,所以我想我需要玩一下.很抱歉浪费了大家的时间,认为这可能是一些奇怪的浮点错误。
您似乎已经意识到,这是因为 Plotly 选择的自动选择的 bin 大小与您的数据不一致。
最简单的方法是 运行 样本大小为“3” - 只有四种可能的结果:0.0、33.33333333、66.66666667 和 100.0。
然而 Plotly 选择的 bins 是 -10 到 10、10 到 30、30 到 50、50 到 70、70 到 90 和 90 到 110。
解决方案是修改方法 UpdatePlot
以便它使用您的样本大小来确定 bin;像这样:
function UpdatePlot(data, args){
Plotly.deleteTraces("plot", 0);
Plotly.addTraces("plot",
{x:data, type:"histogram", autobinx: false,
xbins: {start: -50/ss, end: 100 + (50/ss), size: 100/ss}});
}