Skip to main content

Generate indicators in SAS based on factor variables

Generating indicators from factor variable defined in SAS datafile using a generic procedure in three steps. The code is easy to modify to suite more complicated needs.
  1. Produce table with factor levels
  2. Use data step to generate program
  3. Append indicators by running SAS data step using %include
An example of generative programming...


proc sql; 
  create table levels_data_set_name as 
  select distinct factor_variable_name as indicator_name 
  from input_data_set_name; 
quit; 

data _NULL_; 

  file 'C:\PATH_TO_GENERATED_SAS_PROGRAM\indicators.sas';     
  put 'data somelib.indicator_enriched_data_set;'; 
  put 'set input_data_set_name;'; 
run; 

data _NULL_; 

set levels_data_set_name; 
  file 'C:\PATH_TO_GENERATED_SAS_PROGRAM\indicators.sas' MOD; 
  length char_var $256; 
  char_var='ind'||strip(indicator_name)||'='; 
  put char_var; 
  char_var='('||strip(factor_variable_name)||' EQ '||strip(indicator_name)||'");'; 
  put char_var; 
run; 

data _NULL_; 

  file 'C:\PATH_TO_GENERATED_SAS_PROGRAM\indicators.sas' MOD; 
  put 'run;'; 
run; 

%include 'C:\PATH_TO_GENERATED_SAS_PROGRAM\indicators.sas';



Fetch the code above as SAS program file: GenerateIndicators.SAS


I is also possible to make a simple macro using the code above (ensure you have write access to C:\)

%macro factor2indicators(factor,dataset);
proc sql;
create table levels_data_set_name as 
  select distinct &factor as indicator_name
  from &dataset;
quit;
data _NULL_;
file 'C:\indicators.sas';
put 'data temp_data;';
put 'set &dataset;';
run;
data _NULL_;
set levels_data_set_name;
file 'C:\indicators.sas' MOD;
length char_var $256;
char_var='ind'||strip(indicator_name)||'=';
put char_var;
char_var='('||strip(&factor)||' EQ "'||strip(indicator_name)||'");';
put char_var;
run;
data _NULL_;
file 'C:\indicators.sas' MOD;
put 'run;';
run;

%include 'C:\indicators.sas';

data &dataset;
set temp_data;
run;
%mend;

Comments

Popular posts from this blog

HackRF on Windows 8

This technical note is based on an extract from thread. I have made several changes and added recommendations. I have experienced lot of latency using GnuRadio and HackRF on Pentoo Linux, so I wanted to try out GnuRadio on Windows.



HackRF One is a transceiver, so besides SDR capabilities, it can also transmit signals, inkluding sweeping a given range, uniform and Gaussian signals. Pentoo Linux provides the most direct access to HackRF and toolboxes. Install Pentoo Linux on a separate drive, then you can use osmocom_siggen from a terminal to transmit signals such as near-field GSM bursts, which will only be detectable within a meter.









Installation of MGWin and cmake: Download and install the following packages:
- MinGW Setup (Go to the Installer directory and download setup file)
- CMake (I am using CMake 3.2.2 and I installed it in C:\CMake, this path is important in the commands we must send in the MinGW shell)
Download and extract the packages respectively in the path C:\MinGW\msys\…

Example: Beeswarm plot in R

library(foreign)

data <- read.dta("C:/Users/hellmund/Documents/MyStataDataFile.dta")

names(data)

install.packages('beeswarm')

library(beeswarm)

levels(data$group)

png(file="C:/Users/hellmund/Documents/il6.png", bg="transparent")

beeswarm(data$il6~data$group,data=data, method=c("swarm"),pch=16,pwcol=data$Gender,xlab='',ylab='il6',ylim=c(0,20))

legend('topright',legend=levels(data$Gender),title='Gender',pch=16,col=2:1)

boxplot(data$il6~data$group, data=data, add = T, names = c("","",""), col="#0000ff22")

dev.off()

Real world split-plot designs

Google Earth picture from a blog on statistics. A real world example near Christchurch (NZ) of a split-plot design. Today things have completely changed on location as the forest has grown considerably. Google Earth coordinate link.