La mayoría de las definiciones de la ECDF definir como (nº de elementos <= umbral) / nº de elementos. Matlab y R implementar sus ecdf() funciones mediante esta fórmula.
En mis pruebas, sin embargo, me parece que hay un pequeño sesgo a esta estimación cuando la creación de las muestras usando el estándar de la distribución uniforme, la distribución normal estándar, o la distribución beta con el común de alfa y beta de los valores.
Para ser claro, no estoy hablando acerca de los prejuicios de la ECDF como el número de muestras que se extiende hacia el infinito. El ECDF es imparcial en este sentido. Estoy hablando sobre el sesgo que se produce al aplicar el ECDF a N número de muestras, donde N permanece fija, y un nuevo conjunto de N muestras se genera una y otra vez. En este sentido, el ECDF tiene un sesgo que es inversamente proporcional a N.
En nuestra aplicación, se genera un nuevo conjunto de datos cada vez que el algoritmo de cambios o el algoritmo de cambio de parámetros. Por lo tanto la distribución subyacente, que es desconocido, es diferente para cada prueba. Por lo tanto quiero la mejor estimación de las N muestras de cada prueba, pero no puede combinar las muestras de diferentes pruebas.
Estoy utilizando la interpolación para estimar el CDF para los umbrales de que están entre los valores de la muestra, y estoy suponiendo que la distribución subyacente es continua, pero se desconocen. Yo soy de la interpolación debido a que nuestros límites son continuas y nos gustaría que la estimación de la CDF a ser continua, no cuantificada.
Wikipedia ofrece una definición alternativa para la ECDF que no tiene este sesgo y también las estimaciones con menos error: (nº de elementos <= umbral) / (nº de elementos + 1)
En caso de que hay dos definiciones de la ECDF, uno para la estimación de distribuciones discretas y uno diferente para continua?
Hay pruebas acerca de que el sesgo de un ECDF a la hora de estimar un CDF?
Aquí está un ejemplo simple que hace que el problema obvio. Poner cuatro manzanas en una fila y dibujar una línea entre las manzanas 2 y 3. ¿Qué por ciento de las manzanas están en cada lado de la línea? El EDCF dice que la línea a través de apple 2 es de 50%, la línea a través de 3 es de 75%, y el valor interpolado es de 62,5%, por lo que la estimación es que el 62,5% de las manzanas están a la izquierda de la línea que está a medio camino entre las manzanas 2 y 3.
Aquí está mi código de Matlab que muestra el sesgo:
% Method 1 - ECDF
% Method 2 - Alternative ECDF
cdf = estimateCdf(-2:2, 0.0);
assert(cdf(1) == 0.6);
assert(cdf(2) == 0.5);
numTests = 100 * 1000;
numSamples = 10;
err=zeros(numTests, 2);
for i=1:numTests
threshold = randn(1, 1) * 2;
groundTruth = 1 - (1 - erf(threshold)) / 2;
scores = sort(randn(1, numSamples) * sqrt(0.5)); %% ERF assumes a variance of 0.5
err(i, :) = estimateCdf(scores, threshold) - groundTruth;
end
fprintf('\nTests = %d\n', numTests);
for method = 1:2
fprintf('Method %d\n', method);
fprintf(' RMS Error: %1.6f\n', rms(err(:,method)));
fprintf(' Bias: %1.6f\n', mean(err(:,method)));
end
function cdf = estimateCdf(scores, threshold)
idxList = find(scores < threshold);
cdf = zeros(1,2);
% If there are no scores below threshold then CDF is zero
if isempty(idxList)
for method = 1:2
cdf(method) = 0;
end
% If all scores are below threshold then CDF is 1
elseif idxList(end) == numel(scores)
for method = 1:2
cdf(method) = 1;
end
% Interpolate scores between 2 nearest points to the threshold
else
x0 = idxList(end);
x = [x0, x0 + 1];
xIdx = interp1(scores(x) - threshold, x, 0, 'linear');
% Interpolate the scores to a CDF
cdf(1) = interp1(x, x / length(scores), xIdx, 'linear');
cdf(2) = interp1(x, x / (length(scores) + 1), xIdx, 'linear');
end
end