Vertrauensgrenzen für einen ECDF


7

Ich versuche, aus Daten in Python eine ECDF (und eine Vertrauensgrenze) zu erstellen. Ich kann das ECDF ziemlich einfach numpydurch Sortieren und Verwenden erzeugen linspace. Ich bin mir jedoch nicht ganz sicher, welche Konfidenzgrenzen angemessen sind, und es scheint keine integrierten Bibliotheken zu geben, die die Grenzen berechnen ( statsmodelsscheint nur die ECDF anzugeben).

Wenn ich eine punktweise Konfidenzgrenze von möchte, ist es angebracht, die DKW-Ungleichung zu verwenden, um meine Region mit zu berechnen1α

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

Wo ist die Anzahl der Beobachtungen in meiner Stichprobe? Wenn also mein ECDF ist, wären meine oberen und unteren GrenzennF(x)

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

MATLAB hat eine eingebaute ECDF -Funktion , aber ich hatte nicht viel Glück zu verstehen, wie man die Greenwood-Formel (unten angegeben) anwendet, um die Grenzen zu generieren.


1
Schauen Sie sich stats.stackexchange.com/questions/298290/… und meine Kommentare dort an. Sehen Sie sich den Code von ecdf.ksCI im CRAN-Paket sfsmisc an. Dieser Code ist einfach (ich habe ihn geschrieben ...) und sollte daher leicht in Python zu übersetzen sein ...
kjetil b halvorsen

1
Was nicht ganz klar ist, ist, dass Sie nach punktuellen Grenzen fragen , aber vorschlagen, eine Ungleichung, DKW , zu verwenden, die hauptsächlich verwendet wird, um gleichzeitige Vertrauensgrenzen zu finden . Bitte beachten Sie: Greenwoods Ansatz ist punktuell.
Jim

@Jim Wäre es also einfach falsch, diese Methode oben anzuwenden, oder würde sie mir stattdessen die gleichzeitige Vertrauensbindung geben?
ALollz

1
Es würde Ihnen die gleichzeitige geben. Was in Ordnung ist, wenn Sie danach suchen. Beachten Sie jedoch, dass ein simultanes CI breiter ist als ein punktuelles.
Jim

Antworten:


2

Geben Sie in Matlabs Konsolentyp Folgendes ein:

edit ecdf

Es öffnet den Quellcode im Editor.

Gehen Sie zu Zeile 194:

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

Dies ist der Beginn des Codeblocks, der die unteren und oberen (Vertrauens-) Grenzen berechnet : [Flo, Fup]. Der Codeblock ist 30 Zeilen lang und ziemlich einfach. Gepostet unten für Ihre Bequemlichkeit:

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

Die Quadratwurzel von Greenwoods Formel, dh

S(t)ti<Tdiri(ridi),

wird in Zeile 203 implementiert als:

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

Kannst du es von hier nehmen? Gib mir Bescheid.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.