***************************************************************;
* R 패키지로 처리 후 결과 값 반환 받기
***************************************************************;
SAS에서 지원하지 않은 R 패키지의 다양한 함수를 SAS 의 Proc IML 내부에서 호출하여 사용이 가능하다.
단, 데이터 용량의 제한과 R 패키지에서 데이터 프레임과 Matrix 형태만 호출이 가능하다.
아마도 Proc IML에서 직접 R 패키지를 호출하여서 사용 시에는 여러 제약이 존재하겠지만, SAS 에서 R 패키지의 다양한 기능을 사용하여서 데이터 처리와 분석 영역의 확대가 가능하리라 생각이 된다.
****************************************************************;
* config 파일에 " -RLANG" 옵션 추가;
* R 패키 사용 가능 여부 확인 방법;
proc options option=RLANG;
run;
* SAS에서 R 패키지 사용을 위한 환경 처리 :http://support.sas.com/documentation/cdl/en/imlug/63541/HTML/default/viewer.htm#imlug_r_sect003.htm;
* SAS와 R 패키지 결과 전송은 R 패키지의 데이터 프레임과 Matrix 형태만 전송이 가능하다.
* 참고 : http://support.sas.com/documentation/cdl/en/imlug/63541/HTML/default/viewer.htm#imlug_r_sect007.htm;
* Calling Functions in the R Language
* 다음은 binning을 위한 R 패키지 smbinning 과 binst 를 호출하여 처리하는 예제이다.;
***************************************************************;
* binary 타겟 데이터에 대한 binning;
* smbinning 예제;
* The main purpose of the package is to categorize a numeric variable into bins
* mapped to a binary target variable for its ulterior usage in scoring modeling;
***************************************************************;
proc iml;
submit / R;
# /* Package loading and data exploration */
library(smbinning) # /* 사용 패키지 로딩 */
data(chileancredit) # /* 분석을 위하여 사용 데이터 로딩 */
chileancredit.train=subset(chileancredit,FlagSample==1)
result=smbinning(df=chileancredit.train,y="FlagGB",x="TOB",p=0.05) # /* smbinning 실행 */
# /* Generate new binned characteristic into a existing data frame */
chileancredit= smbinning.gen(chileancredit,result,"gTOB") # /* 대상 데이터에 binning 결과 추가 */
endsubmit;
call ImportDataSetFromR("Work.MyData", "chileancredit"); # /* R 패키지의 데이터 프레임을 SAS 데이터로 전환 */
QUIT;
* sashelp.class;
* smbinning 패키지의 타겟은 Binary(0/1) 형식이어야 함.;
DATA CLASS;
SET SASHELP.CLASS;
IF sex = '남' THEN sex_tar = 0;
ELSE sex_tar = 1;
RUN;
* 예제 데이터 생성;
DATA CLASS;
SET CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS;
RUN;
* 현재 x와 y는 R-project에서 integer 형식이어야 함.;
proc iml;
run ExportDataSetToR("work.Class", "class" ); # /* SAS 데이터 세트를 R 패키지의 데이터 프레임으로 전환 */
submit / R;
print(class)
print(str(class))
# /* integer 형식으로 변경 */
class$sex_tar <- as.integer(class$sex_tar)
class$Weight <- as.integer(class$Weight)
print(str(class))
# /* Load package and its data */
library(smbinning)
# /* Run and save result */
result=smbinning(df=class,y="sex_tar",x="Weight",p=0.05)
print(result)
# /* Generate new binned characteristic into a existing data frame */
chileancredit= smbinning.gen(class,result,"gTOB") # /* Update population */
endsubmit;
call ImportDataSetFromR("Work.MyData", "chileancredit");
QUIT;
***************************************************************;
* R Package 'binst'
* Data Preprocessing, Binning for Classification and Regression
* 참조 : https://github.com/Jules-and-Dave/binst;
***************************************************************;
* create_breaks(x, y = NULL, method = "kmeans", control = NULL, ...);
* A convenience functon for creating breaks with various methods;
* decisiontrees(dt,ctrees) : Create breaks using decision trees (recursive partitioning)
create_dtbreaks(x, y, control = control)
* earth(mars) : Create breaks using earth (i.e. MARS)
create_earthbreaks(x, y, control = control)
* mdlp(entropy) : Create breaks using mdlp;
* create_mdlpbreaks(x, y);
* jenks : Create Jenks breaks
create_jenksbreaks(x, control = control)
* kmeans : Create kmeans breaks.
create_kmeansbreaks(x, control = control);
DATA IRIS;
SET SASHELP.IRIS;
IF Species = 'Setosa' THEN TARGET=1;
ELSE IF Species = 'Versicolor' THEN TARGET=2;
ELSE IF Species = 'Virginica' THEN TARGET=3;
if _n_ <=10 then nom_var = '01';
else if _n_ <=20 then nom_var = '02';
else if _n_ <=30 then nom_var = '03';
else if _n_ <=40 then nom_var = '04';
else if _n_ <=50 then nom_var = '05';
else if _n_ <=60 then nom_var = '06';
else if _n_ <=70 then nom_var = '07';
else if _n_ <=80 then nom_var = '08';
else if _n_ <=90 then nom_var = '09';
else if _n_ <=100 then nom_var = '10';
else if _n_ <=110 then nom_var = '11';
else if _n_ <=120 then nom_var = '12';
else if _n_ <=130 then nom_var = '13';
else if _n_ <=140 then nom_var = '14';
else nom_var = '15';
RUN;
* 독립변수 : 연속형, 종속변수 : 명목형;
proc iml;
run ExportDataSetToR("work.IRIS", "sasiris" );
submit / R;
# print(sasiris)
print(str(sasiris))
# /* Load package and its data */
library(binst)
library(earth)
library(plotmo)
library(plotrix)
library(TeachingDemos)
library(ape)
library(BAMMtools)
dt_breaks <- create_breaks(sasiris$SepalLength, sasiris$Species, method="mdlp")
print(dt_breaks)
sasiris$db_breaks <- create_bins(sasiris$SepalLength, dt_breaks)
endsubmit;
call ImportDataSetFromR("Work.iris_mdlp", "sasiris");
QUIT;
* 독립변수 : 연속형, 종속변수 : 연속형 -> earth;
proc iml;
run ExportDataSetToR("work.iris", "sasiris" );
submit / R;
# print(sasiris)
print(str(sasiris))
# /* Load package and its data */
library(binst)
library(earth)
library(plotmo)
library(plotrix)
library(TeachingDemos)
library(ape)
library(BAMMtools)
dt_breaks <- create_breaks(sasiris$SepalWidth, sasiris$SepalLength, method="earth", control=list(glm=list(family=gaussian)))
print(dt_breaks)
sasiris$db_breaks <- create_bins(sasiris$SepalWidth, dt_breaks)
endsubmit;
call ImportDataSetFromR("Work.iris_earth", "sasiris");
QUIT;
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!