Definición:
Cusum Chart
Para completar las celdas para el diagrama Cusum consideraremos lo siguiente:
Q(t)= Q(t-1) + a(t) - d
donde el valor del Cusum al tiempo t, Q(t) será igual a valor de Q del período previo Q(t-1) más el error al tiempo t, a(t), que tendrá en cuenta los desplazamientos de la media mu con respecto al target y el valor de d(k para el nomograma de Goel y Wu)=1/2mu . El valor de h, intervalo de decisión, se estimará. Los valores se obtuvieron del nomograma para gráficos de control Cusum realizado por Goel y Wu (Determination of ARL and a Contour Nomogram for Cusum Charts to Control Normal Mean,Technometrics, Vol.13,Nº2 May 1971)
Los valores son los siguientes:
Con h=3 , d(k)=1.6
Ho mu=0 ARLo = 10^5
H1
mu=1
ARL1 = 200
mu=2
ARL2 = 7.5
mu=3
ARL3 = 2.85
mu=3.2
ARL3.2 = 2.60
Con h=3.25, d(k)=1.5
Ho mu=0 ARLo= 10^5
H1
mu=1
ARL1= 150 (Cuando mu-k es negativo tomar La)
mu=2
ARL2= 6.8
mu=3
ARL3= 2.85
Con h=5, d(k)=1
Ho mu=0 ARLo= 10^5
H1
mu=1
ARL1= 36
mu=2
ARL2= 5.75
mu=3
ARL3= 3.11
Para valores de mu=1 y h>5 no hay valores ya que caen fuera del análisis
del nomograma, para ello hay que recurrir a la solución analítica
o a la simulación que será la tarea siguiente.
Programa Cusum.exe
#include <conio.h>
#include <stdio.h>
#include "nr.h"
#include "windows.h"
#include <stdlib.h>
#include "nrutil.h"
#define Na 8200
#define N2 4100
//hasta un valor de Na 14700
el programa corre y sale por fichero
//únicamente y hasta
8200 por fichero y gráfico. La diferencias
en
//ARL no es significativa.
FILE *fi; GraphWindow w;
void main(){
int graphdriver = DETECT, graphmode;
long idum=(-15);
int i, j=1, cont_a=1, cont=0
;
float h=1, a=0, cuantil,cuantil2,
mu=2, var=1.;
float Calfa=0.99, Qh=0;
float *Q1, sum=0,sum2=0, *Q2
;
fi=fopen("cusum.dat","w");
Q1=vector(1,Na);
Q2=vector(1,N2);
while (cont_a<=Na) {
a=mu+var*gasdev(&idum);
Qh=Qh+a;
if (Qh<=0)
Qh=0;
if (Qh>=h){
Qh=0;
Q1[cont_a]=cont;
//printf("RL -> %d\n",(int) Q1[cont_a]);
cont_a++; cont=0;
}
cont++;
}
for (i=1;i<=Na;i++){
sum=sum+Q1[i];
}
sum=sum/Na;
printf("ARLr1=%f\n", sum);
fprintf(fi,"ARLr1=%f\n",sum);
for(i=1;i<=Na;i++){
Q2[j]=Q1[i]+Q1[i+1];
sum2=sum2+Q2[j];
i++; j++;
}
sum2=sum2/N2;
printf("ARLr2= %f\n",sum2);
fprintf(fi,"ARLr2= %f\n",sum2);
/*Si guardara "todos" los elementos generados en un vector, donde la suma de sus elementos se van acumulando y luego los ordenara, obtendría la distribución de frecuencias del Cusum, pero trabajamos solo con alarmas.*/
sort(Na,Q1);
cuantil=Calfa*Na;
fprintf(fi,"cuantilr1= %d\n",(int) Q1[cuantil]);
printf("cuantilr1= %d\n",(int) Q1[cuantil]);
sort(N2,Q2);
cuantil2=Calfa*N2;
fprintf(fi,"cuantilr2= %d\n",(int) Q2[cuantil2]);
printf("cuantilr2= %d\n",(int)Q2[cuantil2]);
printf ("\nDone...\nPress
'enter' to plot the distribution");
getchar();
initgraph(&graphdriver,
&graphmode, "c:\\tc\\bgi");
InitWins();
w.xmin=Q1[1];
w.xmax=Q2[N2];
w.ymin=0.;
w.ymax=1.;
initwin(&w);
for (i=1;
i<Na; i++)
plotline(Q1[i],(float) i/(float) Na, Q1[i+1],
(float)(i+1)/(float)Na,w);
setcolor(WHITE);
plotline(Q1[cuantil],0.,Q1[cuantil],1.,w);
printf("\n\n\n(white)Cuantilr1 %4.2f = %d", Calfa, (int) Q1[cuantil]);
setcolor(RED);
plotline(sum,0.,sum,1.,w);
printf("\n (red)ARLr1 = %f", sum);
setcolor(BLUE);
plotline(Q2[cuantil2],0.,Q2[cuantil2],1.,w);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n(blue)Cuantilr2
%4.2f = %d",Calfa, (int) Q2[cuantil2]);
setcolor(GREEN);
plotline(sum2,0.,sum2,1.,w);
printf("\n(green)ARLr2= %f", sum2);
printf("\n h=%f y mu=%f",h,mu);
getch();
closegraph();
fclose(fi);
free_vector(Q1,1,Na);
free_vector(Q2,1,N2);
/* clrscr;*/
}
Bibliografía