Limites de confiança para um ECDF

7

Estou tentando criar um ECDF (e um limite de confiança) a partir de dados em Python. Posso gerar o ECDF facilmente com a numpyclassificação e o uso linspace. No entanto, não estou totalmente certo de quais são os limites de confiança apropriados e não parece haver nenhuma biblioteca statsmodelsinterna que calcule os limites ( parece apenas fornecer o ECDF).

Se eu quero uma confiança pontual vinculada a1 1-αé apropriado usar a desigualdade DKW para calcular minha região com

Cn(α)=1 12nregistro(2α),

Onde né o número de observações na minha amostra? Assim, seF(x) é meu ECDF, meus limites superior e inferior seriam

vocêB(x)=min(1 1,F(x)+Cn(α))
euB(x)=max(0 0,F(x)-Cn(α))

O MATLAB possui uma função interna ECDF , mas não tive muita sorte em entender como aplicar a fórmula de Greenwood (mencionada na parte inferior) para gerar os limites.

ALollz
fonte
11
Dê uma olhada em stats.stackexchange.com/questions/298290/… e meus comentários lá. Veja o código de ecdf.ksCI no pacote CRAN sfsmisc. Esse código é simples (eu escrevi ...) por isso deve ser fácil de traduzir para python ...
Kjetil b Halvorsen
11
O que não está totalmente claro é que você solicita limites pontuais , mas sugere o uso de uma desigualdade, DKW , usada principalmente para encontrar limites de confiança simultâneos . Observação: a abordagem de Greenwood é pontual.
Jim
@ Jim Então, aplicar esse método acima seria incorreto ou me daria a confiança simultânea?
ALollz 04/07
11
Daria a você o simultâneo. O que é bom se é isso que você procura. Mas observe que um IC simultâneo é mais amplo que um em termos de pontos.
Jim

Respostas:

2

No console do Matlab, digite:

edit ecdf

Abre o código fonte no editor.

Vá para a linha 194:

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

Este é o início do bloco de código que calcula os mais baixos - limites (de confiança) e superior: [Flo, Fup]. O bloco de código tem 30 linhas e é bastante direto. Postado abaixo para sua conveniência:

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

A raiz quadrada da fórmula de Greenwood, ou seja,

S(t)tEu<TdEurEu(rEu-dEu),

é implementado na linha 203 como:

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

Você pode pegar daqui? Avise-se me.

Jim
fonte