R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

SAS:n ja R:n yhteispeli: esimerkki

Tilastotieteen ammattilaiset ovat usein jakautuneet eri leireihin riippuen siitä, että mitä sovellusta he aineistojen analysointiin käyttävät. Yhdet vannovat kovasti SAS:n, toiset R:n ja kolmannet esim. SPSS:n nimeen. Muihin analysointisovelluksiin uskovaisia toki löytyy. Omasta mielestäni tilanne on silloin hyvä, kun voi valita mitä sovellusta käyttää. Saman ongelma voi ratkaista monellakin tavalla, ja mielestäni kannattaa hakea sovellus/ohjelmointikieli nimenomaan ongelman näkökulmasta: leukua ei välttämättä kannata käyttää halkojen hakkaamiseen ja kirveellä ei ehkä kannata vuolla hammastikkuja.

On mielenkiintoista, että miten nämä eri tilastotieteen eri sovellukset keskustelevat keskenään. Tällä hetkellä integrointi ei välttämättä ole kovin helppoa, joskin se on käsittääkseni viime aikoina helpottunut. Törmäsin Decision Stats-blogin kautta artikkeliin, jossa esitetään yksi tapa miten SAS ja R pelaavat yhteen. Esimerkki valottaa miten SAS:n saa kutsumaan R:ää, vaikkakin kutsut eivät kulje natiivisti, vaan käyttöjärjestelmä pelaa välissä. Esimerkki pohjautuu suurelta osin edellä mainittuun Hollandin artikkeliin. Koodin lopputulos on html-tiedosto, johon on upotettu R:llä tehty graaffi.

/*Ennen koodin ajamista tee C:\temp\-kansioon alakansiot 'new' ja 'r'*/
/*Lisätietoa koodista löytyy alkuperäisestä artikkelista:*/
/*http://www.hollandnumerics.co.uk/pdf/SAS2R2SAS_paper.pdf*/
 
/*Luo SAS-kirjaston new*/
LIBNAME new 'c:\temp\new';
 
PROC datasets LIB=new KILL;
RUN;
QUIT;
 
/*Muokkaa SAS dataa*/
DATA sasuser.v_prdsale / VIEW = sasuser.v_prdsale;
	SET sashelp.prdsale;
	LENGTH yyq $6;
	yyqtr = year + (quarter - 1)/4;
	mon = MONTH(month);
	yyq = PUT(month, YYQ6.);
	yq = INTCK('QTR', '31dec1992'd, month);
	SELECT (country);
	WHEN ('U.S.A.') cntry = 'USA';
	WHEN ('GERMANY') cntry = 'DE';
	WHEN ('CANADA') cntry = 'CA';
	OTHERWISE;
	END;
RUN;
 
/*Summaroi ja kirjoittaa datan new-kansioon*/
PROC SUMMARY DATA=sasuser.v_prdsale MISSING NWAY;
	CLASS cntry yq product;
	VAR actual;
	OUTPUT OUT=new.prdsale SUM=;
RUN;
 
/*Käytetään makroa, jolla exportoidaan .csv-tiedostoja*/
/*Lähde: http://biostat.mc.vanderbilt.edu/twiki/pub/Main/Hmisc/exportlib.sas*/
%macro exportlib(lib,  outdir, tempdir);
%IF %QUOTE(&outdir)=   %THEN %LET outdir=.;
%IF %QUOTE(&tempdir)=  %THEN %LET tempdir=C:/WINDOWS/TEMP;
OPTIONS NOFMTERR;
PROC COPY IN=&lib OUT=work;RUN;
PROC CONTENTS DATA=work._ALL_ NOPRINT
    OUT=_contents_(KEEP=memname memlabel name type label format length
                        nobs);RUN;
PROC EXPORT DATA=_contents_ OUTFILE="&outdir/_contents_.csv" REPLACE;RUN;
DATA _NULL_; SET _contents_; BY MEMNAME;
    FILE "&tempdir/_export_.sas"; RETAIN bk -1;
    if FIRST.MEMNAME & (NOBS > 0) THEN DO;
        PUT "DATA " MEMNAME "; SET " MEMNAME ";FORMAT _NUMERIC_ BEST14.;RUN;";
        PUT "PROC EXPORT DATA=" MEMNAME " OUTFILE=" '"' "&outdir/" 
            MEMNAME +bk ".csv" '" ' "REPLACE;RUN;";
        END;
    RUN;
%INCLUDE "&tempdir/_export_.sas";RUN;
%MEND exportlib;
 
PROC FORMAT CNTLOUT=_cntlout;
RUN;
 
/*kirjoitetaan .csv tiedostot uuteen käsin luotuun kansioon*/
%exportlib(new, c:/temp/r, c:/windows/temp);
 
/*Kirjoitetaan program.r-tiedostoon suoritettava R-koodi*/
DATA _NULL_;
	FILE 'c:\temp\r\program.r' LRECL=1024;
	PUT 'library(Hmisc)';
	PUT 'library(ggplot2)';
	PUT 'library(grDevices)';
	PUT "sasdata <- sasxport.get('c:/temp/r', method=('csv'))";
	PUT 'jpeg(filename="C:/temp/r/program.jpg", width=600, height=600)';
	PUT 'ggplot(sasdata, aes(x = yq, y = actual)) + geom_point(color = "red") + facet_wrap(cntry ~ product) + stat_smooth(se = FALSE)';
	PUT 'dev.off()';
	PUT 'q()';
RUN;
 
/*Käynnistetään ja ajetaan program.r*/
/*Huomaa, että tässä annettu koko polku r.exe ohjelmalle*/
OPTIONS XWAIT XSYNC;
X "C:\Progra~1\R\R-2.11.1\bin\r.exe --no-save --quiet <""c:\temp\r\program.r"" >""c:\temp\r\program.log""";
 
/*Kirjoitetaan ODS:lla html-raportti*/
ODS ESCAPECHAR='^';
ODS HTML FILE='c:\temp\r\report.html' STYLE=minimal
GPATH='c:\temp\r' GTITLE GFOOTNOTE;	
 
/*Lisätään html-tiedostoon kuvan polku*/
DATA _NULL_;
	FILE PRINT;
	PUT "<IMG SRC='c:\temp\r\program.jpg' BORDER='0'>";
RUN;
 
/*Suljetaan ODS*/
ODS _ALL_ CLOSE;

Lopputulos näyttää tältä:


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *