Archivo

Archivo para la Categoría "Stat"

Calificando nuevas observaciones usando Proc FASTCLUS

noviembre 15, 2011 Deja un comentario

PROC FASTCLUS  se utilza para aplicar el algoritmo k-means para agrupamiento (cluster) de observaciones. Todas las observaciones en el data set de entrenamiento son asignadas a grupos basado en las variables incluidas en el data set. Calificar o puntuar nuevas observaciones puede ser todo un reto ya que las reglas de asignación dependen de los valores de las nuevas observaciones.

Lo anterior se puede lograr usando la opcion SEED en Proc FASTCLUS.

/*Grupos o clusters en el data set de entrenamiento */

%let indsn = input;  *data set the entrada (entrenamiento);
%let nclus = maxclus; *número de cluster-grupos a calcular usando k-means;
%let indvars = varlist; *lista de variables a utlizar en el proceso de agrupamiento;
%let valid = val_data; *data set que queremos califcar o puntuar;

proc fastclus data=&indsn maxclusters = &nclus outseed= clusterSeeds;
var &indvars;
run;

/*Puntuando el nuevo data set*/
proc fastclus data=&valid  out=&valid._scored seed = clusterSeeds maxclusters = &nclus maxiter = 0;
var &indvars;
run;

Referencia:
Data Preparation for Analytics Using SAS” By Gerhard Svolba, Gerhard Svolba, Ph.D.

SASludos,

Alberto

Categorías:Programming, Stat

Indice A-Z de Procs en SAS/STAT

diciembre 18, 2010 2 comentarios

Link a todos los procedimientos en SAS/STAT

http://support.sas.com/rnd/app/da/stat/procedures/Procedures.html

 

SASludos,

 

Alberto

Categorías:Sabías que..., SQL, Stat

Ejemplo: Diseño de Experimentos usando Proc Anova

octubre 13, 2009 Deja un comentario
Un pequeño ejemplo para algunos que me han preguntado como realizar un diseño de experimentos (DOE por sus siglas en inglés) usando SAS/STAT.

Para los que no lo saben SAS tiene su propio modulo de DOE con interfaz gráfica (Base SAS) que contiene una gran cantidad de diseños pre-establecidos. Para los humanos comunes como nosotros que solo tenemos el STAT exiten 2 procedimientos el ANOVA y GLM para llevar acabo este tipo de análisis.

En este ejemplo solo contiene el Proc ANOVA que solo debe ser usado cuando el diseño es balanceado.

Para aquellos que tienen el Montgomery de Diseño de Experimentos (la edición verde) es el ejemplo de la pág 219.

data montgomery_pag219;
do replica=1 to 3;
do catalizador=-1 to 1 by 2;
do reactivo=-1 to 1 by 2;
input y @; output;
end;
end;
end;
cards;
28 36 18 31
25 32 19 30
27 32 23 29
;

proc anova data=montgomery_pag219;
class reactivo catalizador;
model y= reactivo catalizador reactivo*catalizador;
run;

SASludos,

Alberto

Categorías:Programming, Shorts, Stat

Muestreo Sistemático con SAS

septiembre 4, 2009 Deja un comentario
El muestreo sistemático consiste en la elección de una muestra a partir de los elementos de una lista según un orden determinado, o recorriendo la lista a partir de un número aleatorio determinado. Esta es la definición más sencilla de muestreo sistemático sin tener que profundizar mucho.

Un pequeño ejemplo de como realizar un muestreo sistemático usando el Proc SurveySelect.


Vamos a suponer que deseamos crear una muestra sistemática del data set sashelp.class y que contenga el 50% de la información. El código sería:

PROC SURVEYSELECT data=sashelp.class out=_sys_ method=sys samprate=0.5 OUTSORT=class_sorted;
control age;
run;

Donde,

Method=sys indica que la selección será sistemática
Samprate=0.5 indica que el tamaño de la muestra será del 50%
Outsort= es el nombre del data set ordenado por la variable utilizada en la sentencia CONTROL
Control= Esta opción específica la variable que deseamos utilizar para crear la muestra, así el data set es ordenado por esta variable para posteriormente hacer la selección sistemática.

Sin la opción control, la muestra será seleccionada en el orden en el que aparecen en originalmente los datos.

SASludos,

Alberto

Categorías:Programming, Shorts, Stat

ODS Trace On: Más características del ODS

agosto 17, 2009 Deja un comentario
Para todos es un hecho que el ODS posee una versatilidad casi inigualable en cuanto a su habilidad para adaptarse a cualquier formato de salida.

No obstante, esta no es su única habilidad. También podemos crear data sets automáticamente a partir de procedmientos SAS. A continuación les dio una breve explicación.

Cuando ejecutamos cualquier procedimiento SAS como por ejemplo el Proc Freq, este nos devuelve una salida (en SAS Foundation sería el Output Windows), un reporte (en Enterprise Guide sería un html). Esta salida contiene información acerca de la frecuencia de cada valor contenido en la variable(s) específicada(s) en la sentencia TABLE. Esta información que SAS nos presenta en formato de reporte es adicionalmente almacenada en data set al que podemos tener acceso utilizando los ODS Output Tables.

Para saber que tipo salidas produce cada procedimiento debemos usar el ODS Trace ON. Aquí un ejemplo sencillo:

ods trace on;
proc freq data=sashelp.class;
table sex;
run;
ods trace off;

El ODS Trace on produce el siguiente resultado en el Log:

Output Added:
————-
Name: OneWayFreqs
Label: One-Way Frequencies
Template: Base.Freq.OneWayFreqs
Path: Freq.Table1.OneWayFreqs
————-

El mensaje anterior nos dice que el Proc freq creo el data set OneWayFreqs para generar el reporte que vimos cuando ejecutamos el procedmiento.

A medida que nuestro Proc se hace más complejo, es decir agregamos más variables, cruces, opciones o estadísticas el procedimiento genera data set adicionales.

Como accesamos esta información? como la guardamos en un data set “nuestro”? Para esto usamos la opción ODS OUTPUT de la siguiente manera:

ods output OneWayFreqs=Myfreqs;
proc freq data=sashelp.class;
table sex;
run;

Con el código anterior hemos creado el data set Myfreqs con la información contenida en el data set OneWayFreqs. Podemos crear tantos data sets como outputs sean creados con las opciones de procedmiento que vamos a ejecutar.

Ahora bien, para saber a que tipo de información tenemos acceso en cada procedimiento, debemos ir al HELP de SAS/EG, buscar el procedimiento y buscar bajo la opción de ODS TABLE NAMES que tenemos disponible.

Esta tarea se puede volver algo tediosa cuando sabemos lo que necesitamos pero no sabemos cual es el Proc más adecuado (distintos Proc pueden crear la misma información).

Para ello he creado una lista pública donde puede obtener los tipos de objetos de salida por Producto y Procedimiento SAS.

Aquí tienen el link: http://tinyurl.com/olabu3

Espero le sea de utilidad!

SASludos,

Alberto

ODS Statistical graphics: Análisis de Correlación

agosto 13, 2009 Deja un comentario

Esta característica de SAS ODS (ya no tan nueva) nos permite crear gráficos automáticamente utilizando los procedimientos estadísticos más comunes.

Algunos de ellos son experimentales mientras que otros ya están en producción.

Aquí tienen un pequeño ejemplo de un análisis de correlación lineal que utiliza este tipo de ODS.


ods html;
ods graphics on;

title ‘Analysis de correlacion para SASHELP.class’;
proc corr data=sashelp.class pearson spearman plots;
var Weight height age;
run;

ods graphics off;
ods html close;

SASludos,

Alberto

Categorías:Programming, Shorts, Stat

Bootstrap en 3 pasos!

junio 10, 2009 4 comentarios
Es impresionante ver como analistas y programadores SAS tratando de aplicar técnicas de remuestreo como el bootstrapping, piensan en una super macro que contiene n cantidad de líneas de código, cientos de condicionales, bucles, contadores y complican las cosas de tal manera que muchas veces hasta desisten de aplicar estás técnicas.

Este post contiene algunas ideas sobre el bootstrapping y como aplicarlo en 3 simples pasos

El bootstrap o estimación de Monte Carlo es un método de remuestreo no paramétrico propuesto por Bradley Efron en 1979. La idea central de este método es simple; dada una muestra aleatoria con n observaciones dicha muestra es tratada como si fuera toda la población de las cuál extraeremos B muestras con reemplazamiento.

Para cada remuestreo se calculará el valor del estimador bootstrap que se utilizará para estimar la variabilidad muestral. Tal y como los estudios teóricos han demostrado, este enfoque proporciona una buena aproximación de la distribución de los estimadores, lo cual permitirá describir algunas de sus propiedades muestrales, así como el cálculo de intervalos de confianza y la realización de contrastes de hipótesis.

El procedimiento bootstrap es útil para:
- Valorar el sesgo y el error muestral de un estadístico calculado a partir de una muestra.
- Establecer un intervalo de confianza para un parámetro estimado.
- Realizar una prueba de hipótesis respecto a uno o más parámetros poblacionales.
Adicionalmente, el bootstrapping tiene varios métodos para estimar intervalos de confianza:
• Percentile Bootstrap
• Standard Bootstrap
• Bootstrap-t (“Pivotal Bootstrap”)
• Bias-corrected (BCa) Bootstrap
Cuál método debemos seleccionar? Bueno esto es ejercicio para el “buen” sentido común de cada quién.
Antes de empezar con nuestro ejemplo quiero recalcar que si la muestra original es una mala representación de la población (todas, absolutamente todas las muestras son representativas!!! Ahora bien, que sean una buena o mala representación es otro tema) no importa que técnica de muestreo utilicen, los resultados los llevarán a tomar las decisiones equivocadas!.
Veamos un ejemplo detallado de cómo construir un intervalo de confianza del 95% para la media de la siguiente manera:
1- Generar una muestra aleatoria de tamaño 20 que siga una distribución normal con media=50 y dev std=15.
2- Calcular algunos estadísticos como la media, la desviación estándar, error estándar y el rango.
3- Generar B=100 muestras con reemplazamiento a partir de nuestra muestra original.
4- Calcular la media para cada una de las B muestras.
5- Aplicar el método de los percentiles para calcular un intervalo de confianza del 95% para la media
6- Comparar el IC bootstrap con el IC asumiendo que la muestra sigue una distribución normal como lo es en nuestro caso.
7- Bootstrap en 3 pasos!!!

Paso 1: Nuestra muestra aleatoria de normalmente distribuida de tamaño 20

data muestra;
do i=1 to 20;
x=int(RAND(‘NORMAL’,50,15));
output;
end;
drop i;
run;

Paso 2: Medidas de tendencia central

proc means mean median std stderr range;run;

Mean =49.0500000
Median =47.0000000
Std Dev=16.4299950
Stderr= 3.5327602
Range =67.0000000

Paso 3: Generar 100 muestras con reemplazamiento

proc surveyselect data=muestra out=boot /* a */
seed=441244 /* b */
method=urs /* c */
samprate=1 /* d */
outhits /* e */
rep=100; /* f */
run;

Vamos a detenernos aquí para explicar el Proc SurveySelect. El procedimiento SurveySelect ofrece una variedad de métodos de muestreo para seleccionar muestras aleatorias basadas en simples o complejos diseños de muestras.

La leyenda se explica de la siguente manera:
a – Invocamos SurveySelect y definimos archivo fuente (data o población) y nuestro archivo de salida (nuestra muestra o out)
b – definimos la semilla con que iniciaremos nuestro generador de números pseudo-aleatorios con la opción seed
c – definimos el método de muestreo, recuerden que necesitamos generar B muestras aleatorias con reemplazamiento (también llamada Unrestricted Random Sampling URS)
d – Con la opción SAMPRATE=1 obtenemos muestras del mismo tamaño que la muestra original.
e – Outhits indica cuanta veces fue seleccionada una observación para construir la muestra Bi
f – Rep nos permite seleccionar el número de muestras a generar

Paso 4: Calcular la media para cada una de las B muestras

proc univariate data=boot noprint;
var x;
by Replicate;
output out=meanall mean=mean;
run;
Replicate es una variable automática generada por el SurveySelect que indica que el nro de la muestra replicada.
Nuevamente vamos a detenernos aquí y vamos a echar un vistazo al histograma de las medias.


Interesante no? A que les recuerda esa distribución?

Paso 5: Aplicar el método de los percentiles para calcular un intervalo de confianza del 95% para la media.
Para generar este intervalo solo necesitamos calcular 2.5-ésimo percentil y el 97.5-ésimo percentil, estos los podemos obtener con el Univariate.

proc univariate data=outall;
var mean;
output out=final pctlpts=2.5, 97.5 pctlpre=ic;
run;

Con un 95% de confianza podemos decir que la media está entre (41.85, 54.6)

Paso 6: Calcular un intervalo de confianza del %95 para media de una distribución normal con media=50 y dev std=15. Toda la información que necesitamos ya la hemos calculado en el paso 2 así que solo queda construir el intervalo de la siguiente manera:

Media +- ( t ( 1 – alfa / 2 ) ) * STDERR

DATA Normal_IC ;
LI = 50 – ( TINV ( 0.95 , 20-1 ) * 3.5327602 ) ;
LU = 50 + ( TINV ( 0.95 , 20-1 ) * 3.5327602 ) ;
output;
RUN ;

Nuestro intervalo del 95% es (43.89,56.10) el cual es muy semejante al que calculamos usando bootstrapping.

Paso 7: Solo en 3 Pasos!!!

*Paso 1;
proc surveyselect data=muestra out=boot
seed=441244
method=urs
samprate=1
outhits
rep=100;
run;
*Paso 2;
proc univariate data=boot noprint;
var x;
by Replicate;
output out=meanall mean=mean;
run;
*Paso 3;
proc univariate data=meanall;
var mean;
output out=interval pctlpts=2.5, 97.5 pctlpre=ic;
run;

Para descargar el programa completo hagan clic aquí.

Un comentario final, esto es solo una breve intro al bootstrapping, este tema tiene mucho bemoles y les recomiendo leer un texto más avanzados sobre este tema.

SASludos,

Alberto

Categorías:Programming, Stat

La Distribución Normal y la regla Empírica

mayo 19, 2009 Deja un comentario
Recuerdan cuando en la universidad les decían (para aquellos que estudiamos estadística de alguna manera) que alrededor del 68% de los valores de una distribución normal están a una desviación típica de la media, µ; que alrededor del 95% de los valores están a dos desviaciones típicas de la media y alrededor del 99,7%están a tres desviaciones típicas de la media? Bueno esto se conoce como la “regla 68-95-99,7″ o la “regla empírica”.

Vamos a hacer un pequeño ejercicio usando SAS para demostrar esto empíricamente ;-)

Primero vamos a guiarnos por el libro negro y vamos a crear una secuencia de 10.000 números aleatorios uniformemente distribuidos. Posteriormente vamos a usar la transformación Box-Muller (se los dije que me iba a guiar por el libro negro, no quiero profesores de estadística por allí molestos) para crear una distribución normal standard.

data pseudo_rand(drop=i);
do i = 1 to 10000;
u1 = ranuni(0);
u2 = ranuni(1);
/*Transformacion Box-Muller*/
z1 = cos(2*3.141516*u2)*sqrt(-2*log(u1)) ;
output;
end;
run;

Una vez creada nuestra muestra vamos a chequear que en verdad se ajusta a
distribución normal. Para ello vamos a utilizar Proc Univariate.

proc univariate data=pseudo_rand plot normal ;
var z1;
run;

Aquí tienen una versión sumarizada del reporte generado por el Univariate.

.nobrtable br { display: none }



























Moments
N 10000 Sum Weights 10000
Mean -0.0082084 Sum Observations -82.083704
Std Deviation 0.99724547 Variance 0.99449853
Skewness -0.0181247 Kurtosis -0.0304879
Uncorrected SS 9944.66461 Corrected SS 9943.99084

.nobrtable br { display: none }























Tests for Normality
Test Statistic p Value
Kolmogorov-Smirnov D 0.005782 Pr>D >0.1500
Cramer-von Mises W-Sq 0.062107 Pr > W-Sq >0.2500
Anderson-Darling A-Sq 0.413538 Pr > A-Sq >0.2500

Ok, ahora vamos a calcular nuestra media y desviación típica usando Proc Means. Claramente esto se pudo haber calculado con anterioridad en el Univariate, pero me pareció oportuno mostrar varias formas de generar el mismo resultado.

proc means data=pseudo_rand noprint;
var z1 ;
output out=descriptiva(drop=_type_ _freq_)
mean=m
std=s;
run;
EL siguiente paso, es crear una marca para cada observación, si el número aleatorio se encuentra dentro de los límites de +/- una desviación típica, lo marcamos como cero, sino lo marcamos como 1. Lo mismo hacemos para los casos de dos y tres desviaciones típicas.

data Intervalos;
set pseudo_rand;
if _n_ = 1 then set descriptiva;
if z1 lt (m – s ) or z1 gt (m + s) then s1gma=1;
else s1gma=0;
if z1 lt (m – 2*s ) or z1 gt (m + 2*s) then s2gma=1;
else s2gma=0;
if z1 lt (m – 3*s ) or z1 gt (m + 3*s) then s3gma=1;
else s3gma=0;
run;
Si posteriormente calculamos la frecuencia de las marcas para cada caso deberíamos obtener valores muy cercanos a la regla 68-95-99,7

proc freq data=Intervalos;
table s1gma s2gma s3gma;run;

De nuevo una versión corta del reporta para apreciar que la regla se cumple.

.nobrtable br { display: none }



















Resultados para 1 Desv. Típica
Marca Frecuency Percent
0 6841 68.41%
1 3159 31.59%

.nobrtable br { display: none }



















Resultados para 2 Desv. Típica
Marca Frecuency Percent
0 9544 95.44%
1 456 4.56%

.nobrtable br { display: none }



















Resultados para 3 Desv. Típica
Marca Frecuency Percent
0 9973 99.73%
1 27 0.27%

Lo ideal sería repetir este ejercicio digamos 1000 veces con distintas secuencias de números aleatorios para llegar al 68-95-99,7. Pero eso se los dejo a ustedes.

Si tengo tiempo esta semana les posteo como comprobar usando SAS que una muestra de N>30 sigue una distribución Normal.

SASludos,

Alberto

Categorías:Programming, Stat

Generar Números aleatorios entre 2 valores

mayo 18, 2009 14 comentarios
En los últimos días me han preguntado 2 veces como generar números aleatorios entre 2 valores en SAS. Realmente la manera de generar estás secuencias de números aleatorios va más allá del software que estes utilizando, puede ser SAS, Ms Excel, Visual Basic, Java etc etc. La base es la misma. Aquí tienen un pequeño ejemplo.


La función o ecuación que vamos a utilizar es la siguiente:

Int((MaxValue – MinValue + 1) * Rnd) + MinValue

donde, MaxValue y MinValue son los valores extremos de cadena o secuencia de números aleatorios que se desean generar y Rnd es la distribución que deseamos utilizar, puede ser Uniforme, Normal, Poisson, Binomial, Weibull etc.

El siguiente ejemplo genera 100 números aleatorios uniformes entre 100 y 1000.

Data random;
do i=1 to 100;
secuencia=Int((1000 – 100 + 1) * ranuni(058212)) + 100;
output;
end;
run;

SASludos

Alberto

Categorías:Programming, Shorts, Stat

Muestreo Estratificado Proporcional con SAS

mayo 5, 2009 Deja un comentario
Hoy mi vena estadística reclama que no haya posteado ningún artículo relacionado con la estadística, así que voy a publicar el primero y es sobre Muestreo.

Antes que nada, quiero aclarar que lo que pretendo mostrar con este ejemplo es como calcular una muestra de tamaño n que siga la misma distribución de la población original. Los grupos, subpoblaciones, estratos que utilizaremos para crear esta muestra no necesariamente siguen la definición clásica del muestreo estratificado.

Ahora bien, vamos con un poco de teoría:
Según Wikipedia “El muestreo estratificado consiste en la división previa de la población de estudio en grupos o clases que se suponen homogéneos respecto a característica a estudiar. A cada uno de estos estratos se le asignaría una cuota que determinaría el número de miembros del mismo que compondrán la muestra. Dentro de cada estrato se suele usar la técnica de muestreo sistemático, ya que con aquella suelen ser las técnicas más usadas en la practica.

Según la cantidad de elementos de la muestra que se han de elegir de cada uno de los estratos, existen dos técnicas de muestreo estratificado:

Asignación proporcional: el tamaño de cada estrato en la muestra es proporcional a su tamaño en la población.
Asignación óptima: la muestra recogerá más individuos de aquellos estratos que tengan más variabilidad. Para ello es necesario un conocimiento previo de la población.
Por ejemplo, para un estudio de opinión, puede resultar interesante estudiar por separado las opiniones de hombres y mujeres pues se estima que, dentro de cada uno de estos grupos, puede haber cierta homogeneidad. Así, si la población está compuesta de un 55% de mujeres y un 45% de hombres, se tomaría una muestra que contenga también esa misma proporción
.”

Ok, ahora veamos como lo hacemos (al menos como yo lo hago) en SAS:

-Para este ejemplo vamos a usar el dataset sashelp.shoes, la muestra que necesitamos es de 10% del total de la población.

/* 1) Necesitamos saber los pesos de los grupos que vamos a utilizar como estratos, en este ejemplo vamos a usar la variable Region.*/

proc freq data=sashelp.shoes noprint;
table region /missing out=strata_counts(drop= percent rename=(count=_nsize_));
run;

/*
2) Ahora calculamos el tamaño de la muestra que sabemos que es de 10%. Pueden darse cuenta que el redondeo lo estoy haciendo hacia arriba, pero la verdad es a juicio del facultativo
*/

data strata_counts2;
set strata_counts;
_nsize_ = ceil(_nsize_*0.10);
run;

/*
3) Usando Surveyselect y con la información anterior calculamos nuestra muestra
*/

Proc Surveyselect data=sashelp.shoes sampsize=strata_counts2 out=sample ;
strata region;run;

/*
4) Graficos la distribucion de la población y de la muestra para constatar que relativamente siguen la misma distribución.
*/

title “Distribucion de la Poblacion”;
PROC GCHART DATA=sashelp.shoes;
VBAR3D Region /
SHAPE=BLOCK
FRAME TYPE=FREQ
pct
COUTLINE=BLACK
RAXIS=AXIS1
MAXIS=AXIS2
PATTERNID=MIDPOINT
;
RUN;QUIT;

title “Distribucion de la Muestra”;
PROC GCHART DATA=sample;
VBAR3D Region /
SHAPE=BLOCK
FRAME TYPE=freq
pct
COUTLINE=BLACK
RAXIS=AXIS1
MAXIS=AXIS2
PATTERNID=MIDPOINT
;
RUN;QUIT;

SASludos,

Alberto

Categorías:Programming, Stat
Seguir

Get every new post delivered to your Inbox.