ECDF 的置信范围

机器算法验证 统计学意义 置信区间 Python matlab
2022-04-08 15:36:53

我正在尝试从 Python 中的数据创建 ECDF(和置信界限)。numpy通过排序和使用,我可以很容易地生成 ECDF linspace但是,我并不完全确定合适的置信范围是多少,而且似乎没有任何内置库可以计算范围(statsmodels似乎只是给出了 ECDF)。

如果我想要一个逐点置信区间1α使用DKW 不等式计算我的区域是否合适

Cn(α)=12nlog(2α),

在哪里n我的样本中的观察次数是多少?因此,如果F(x)是我的 ECDF,我的上限和下限是

UB(x)=min(1,F(x)+Cn(α))
LB(x)=max(0,F(x)Cn(α))

MATLAB 有一个内置函数ECDF,但我没有太多运气理解如何应用格林伍德公式(在底部引用)来生成边界。

1个回答

在 Matlab 的控制台类型中:

edit ecdf

它在编辑器中打开源代码。

转到第 194 行:

if nargout>2 || (nargout==0 && isequal(bounds,'on'))

这是计算下限和上限(置信度)边界的代码块的开始[Flo, Fup]代码块长 30 行,非常简单。为了您的方便,贴在下面:

if nargout>2 || (nargout==0 && isequal(bounds,'on'))
     % Get standard error of requested function
     if cdf_sf % 'cdf' or 'survivor'
         se = NaN(size(D));
         if N(end)==D(end)
            t = 1:length(N)-1;
         else
            t = 1:length(N);
         end
         se(t) = S(t) .* sqrt(cumsum(D(t) ./ (N(t) .* (N(t)-D(t))))); % <--- line 203
     else % 'cumhazard'
         se = sqrt(cumsum(D ./ (N .* N)));
     end

     % Get confidence limits
     zalpha = -norminv(alpha/2);
     halfwidth = zalpha*se;
     Flo = max(0, Func - halfwidth);
     Flo(isnan(halfwidth)) = NaN; % max drops NaNs, put them back
     if cdf_sf % 'cdf' or 'survivor'
         Fup = min(1, Func + halfwidth);
         Fup(isnan(halfwidth)) = NaN; % max drops NaNs
     else % 'cumhazard'
         Fup = Func + halfwidth; % no restriction on upper limit
     end
         Flo = [NaN; Flo];
         Fup = [NaN; Fup];
else 
     Flo = [];
     Fup = [];
end

格林伍德公式的平方根,即

S(t)ti<Tdiri(ridi),

在第 203 行中实现为:

se(t) = S(t) .* sqrt(cumsum(D(t) ./ (N(t) .* (N(t)-D(t)))));

你能从这里拿走吗?让我知道。