PROC FREQ is one of the most popular procedures in the SAS language. It is mostly used to describe frequency distribution of a variable or combination of variables in contingency tables. However, PROC FREQ has much more functionality than that. For an overview of all that it can do, see an introduction of the SAS documentation. SAS Viya does not have PROC FREQ, but that doesn’t mean you can’t take advantage of this procedure when working with BIG DATA. SAS 9.4m5 integration with SAS Viya allows you to summarize the data appropriately in CAS, and then pass the resulting summaries to PROC FREQ to get any of the statistics that it is designed to do, from your favorite SAS 9.4 coding client. In this article, you will see how easy it is to work with PROC FREQ in this manner.
These steps are necessary to accomplish this:
- Define the CAS environment you will be using from a SAS 9.4m5 interface.
- Identify variables and/or combination of variables that define the dimensionality of contingency tables.
- Load the table to memory that will need to be summarized.
- Summarize the data with a CAS enabled procedure, use PROC FEDSQL for high cardinality cases.
- Write the appropriate PROC FREQ syntax using the WEIGHT statement to input cell count data.
Step 1: Define the CAS environment
Before you start writing any code, make sure that there is an _authinfo file in the appropriate user directory in your system (for example, c:\users\<userid>$$ with the following information:
host <cas server name> port <number> user "<cas user id>" password "<cas user password>"
This information can be found by running the following statement in the SAS Viya environment from SAS Studio:
cas; caslib _all_ assign;
Then, in your SAS 9.4m5 interface, run the following program to define the CAS environment that you will be working on:
options cashost="<cas server name>" casport=<number>; cas mycas user=<cas user id>; libname mycas cas; /** Set the in memory shared library if you will be using any tables already promoted in CAS **/ libname public cas caslib=public;
Figure 1 shows the log and libraries after connecting to the CAS environment that will be used to deal with Big Data summarizations.
Step 2: Identify variables
The variables here are those which will be used in the TABLE option in PROC FREQ. Also, any numeric variable that is not part of TABLE statement can be used to determine the input cell count.
Step 3: Load table to memory
There are two options to do this. The first one is to load the table to the PUBLIC library in the SAS Viya environment directly. The second option is to load it from your SAS 9.4m5 environment into CAS. Loading data into CAS can be as easy as writing a DATA step or using other more efficient methods depending on where the data resides and its size. This is out of scope of this article.
Step 4: Summarize the data with a CAS enabled procedure
Summarizing data for many cross tabulations can become very computationally expensive, especially with Big Data. SAS Viya offers several ways to accomplish this (i.e. PROC MEANS, PROC MDSUMMARY, PROC FEDSQL). There are ways to optimize performance for high cardinality summarization when working with CAS. PROC FEDSQL is my personal favorite since it has shown good performance.
Step 5: Write the PROC FREQ
When writing the PROC FREQ syntax make sure to use the WEIGHT statement to instruct the algorithm to use the appropriate cell count in the contingency tables. All feature and functionality of PROC FREQ is available here so use it to its max! The DATA option can point to the CAS library where your summarized table is, so there will be some overhead for data transfer to the SAS 9 work server. But, most of the time the summarized table is small enough that the transfer may not take long. An alternative to letting PROC FREQ do the data transfer is doing a data step to bring the data from CAS to a SAS base library in SAS 9 and then running PROC FREQ with that table as the input.
Figure 2 below shows a sample program on how to take advantage of CAS from SAS 9.4m5 to produce different analyses using PROC FREQ.
Figure 3 shows the log of the summarization in CAS for a very large table in 1:05.97 minutes (over 571 million records with a dimensionality of 163,964 for all possible combinations of the values of feature, date and target). The PROC FREQ shows three different ways to use the TABLE statement to produce the desired output from the summarized table which took only 1.22 seconds in the SAS 9.4m5 environment.
/** Connect to Viya Environment **/ options cashost="xxxxxxxxxxx.xxx.xxx.com" casport=5570; cas mycas user=calara; libname mycas cas datalimit=all; /** Set the in memory shared library **/ libname public cas caslib=public datalimit=all; /** Define macro variables **/ /* CAS Session where the FEDSQL will be performed */ %let casref=mycas; /* Name of the output table of the frequency counts */ %let outsql=sql_sum; /* Variables for cross classification cell counts */ %let dimvars=date, feature, target; /* Variable for which frequencies are needed */ %let cntvar=visits; /* Source table */ %let intble=public.clicks_summary; proc FEDSQL sessref=&casref.; create table &outsql. as select &dimvars., count(&cntvar.) as freq from &intble. group by &dimvars.; quit; run; proc freq data=&casref..&outsql.; weight freq; table date; table date*target; table feature*date / expected cellchi2 norow nocol chisq noprint; output out=ChiSqData n nmiss pchi lrchi; run;
My CAS table is huge to perform PROC FREQ as implicit data transfer happens from CAS to SAS. But the default CASDATALIMIT option is less than the CAS table so it fails while transferring data to SAS from CAS. For now I used PROC FREQTAB and it worked. Is there any option to enable in log when such data transfers happen?
How is proc freqtab different from proc freq?
Yes, proc freq works now.
Has this changed in 3.5? Does Proc Freq work now?