SAS_codes_multivariate_1(Lab1&hw1)

TEMP·2021년 10월 9일
0

SAS

목록 보기
7/13

Data

options validvarname = any;
%let path = D:\Chrome;

한글 변수를 사용할 수 있게 해준다.
path를 지정해준다.

data one;
input a b $;
cards;
1 a 
2 b
;
run;

가장 기본적인 방법으로 직접 쓰기.
$는 문자열에 추가해줘서 문자로 인식 할 수 있게끔.

proc import datafile = "&path\np_traffic.csv" dbms = csv replace out = traffic;
getnames = yes;
run;
proc import datafile = "&path\iris.xlsx" dbms = xlsx replace out = iris;
getnames = yes;
run;

외부파일을 불러온다.
앞에서 지정해놓은 path를 이용한다.
dbms로 읽을 파일의 확장자 명을 알려주고 replace로 이미 있다면 덮어쓰게 한다.
out으로 저장할 dataset의 이름을 지정한다.
getnames으로 변수명까지 불러온다.

proc print data = iris(obs = 10);
run;

10번째 행까지만 보여준다.

proc contents data = iris;
run;

dataset의 구조를 보여준다.
단. 기초통계량은 아니다.

proc sort data = iris out = sorted_iris1;
by Sepal_Length;
run;
proc sort data = iris out = sorted_iris2;
by descending Sepal_Length;
run;

해당 변수를 기준으로 data를 정렬한다.

data iris_dummy1;
set iris;
if Species = "setosa" then dummy = 1;
else dummy = 0;
run;

또는

data iris_dummy1;
set iris;
dummy = (Species = "setosa");
run;

새로운 변수에 설정한 조건에 따라 값을 채워 넣는다.

data data_bind;
set data1 data2;
run;

set에 두개의 dataset을 넣어주면 상하로 결합된다.

proc sort data = data1 out = data1_sorted;
by Species;
run;
proc sort data = data2 out = data2_sorted;
by Species;
run;
data data1_merge;
merge data1_sorted data2_sorted;
by Species;
run;

하나의 변수를 기준으로 옆으로 결합 할 수 있다.
다만 해당변수에 대하여 순서대로 정렬이 선행되어야 한다.

정확히 기억은 안나는데 아마 by 뒤에 변수는 sort가 필수로 선행되어야 할꺼다.(for all procs)

proc export data = iris_merge dbms = xlsx replace outfile = "&path\iris_merge.xlsx";
run;

export dataset as excel

기초통계량

proc univariate data = iris;
run;

dataset의 숫자로 되어있는 변수의 개수만큼의 결과가 나온다.
즉, 예를들어 총 변수가 5개이고 그중 4개는 numerical data라면 해당 4개의 변수펼 기초통계량이 나온다.

proc univariate data = iris;
class Species;
run;

기본적으로 위와 같이 4개의 결과가 나오고 각 결과별로 class로 지정해준대로 group화 되어 나온다.
즉 unique(class)=n 이면 총 4n개의 결과가 나온다.

proc means data = iris max min mean maxdec = 1;
run;

마찬가지로 기본적으로 각각의 numeric variable에 대한 설정해준 통계량.

Matrix

https://support.sas.com/resources/papers/proceedings13/144-2013.pdf
이게 공식문서인듯 하다.

proc iml을 이용하는데 행렬을 만드는 방법은 크게 두가지가 있는듯 하다.

첫번째 직접 행렬 작성하기.

proc iml;
A = {2 1 1, 2 1 0, -1 -2 -1};
B = inv(A);
A_prime = A`;
print A, B, A_prime;
run;

numpy랑 굳이 비교 하자면 np.array()로 감싸주는 것이 여기서는 {}이라고 보면 될듯.

두번째 dataset에서 불러오기

data one;
input x1 x2 x3@@;
cards;
2 1 1 2 1 0 -1 -2 -1
;
run;
proc iml;
use one;
read all into A;
B = inv(A);
A_prime = A`;
print A, B, A_prime;
run;

one 이라는 dataset을 사용하여 다 모든 원소를 부른다.
서로 다른 dataset에 있으면 위아래로 합쳐 아래설명에 있는 submatrix을 이용하면 될듯.

submatrix (slicing)

proc iml;
use one;
read all into A;
B = A[1,];
C = A[2,3];
D = A[1:2, 2:3];
print A, B, C, D;
run;

다음과 같이 sub matrix를 만들 수 있으며 slicing방식은 numpy와 같다.

Eigen valuse and vectors

proc iml;
reset print;
use one;
read all into A;
call eigen(m, e, A);
run;

이건 한번에 출력하고

proc iml;
use one;
read all into A;
eigvals = eigval(A);
print eigvals;
create eignal_dat var {eigvals};
append;
close eigval_dat;
run;

이건 value를 dataset으로 저장하고

proc iml;
use one;
read all into A;
eigvecs = eigvec(A);
print eigvecs;
create eigvecs_dat from eigvecs;
append from eigvecs;
close eigvecs_dat;
run;

이건 vector를 dataset으로 저장한다.

simple example

proc import datafile = "&path\bird_data.xlsx" dbms = xlsx replace out = bird_data;
getnames = yes;
run;

data 읽고

proc print; run;

data 확인하고

proc contents data = bird_data;
run;

dataset의 형태 보고

proc means data = bird_data mean max min maxdec = 1;
run;

dataset의 통계량 보고

proc gplot data = bird_data;
plot tail_length*wing_length;
run;

산점도 그리고

proc univariate data = bird_data;
var wing_length;
histogram wing_length;
run;

기초통계량보고

proc corr data = bird_data cov noprob;
var tail_length wing_length;
run;

공분산행렬본다.

example

data hw;
input y1-y3;
cards;
35 3.5 2.80
35 4.9 2.70
40 30.0 4.38
10 2.8 3.21
6 2.7 2.73
20 2.8 2.81
35 4.6 2.88
35 10.9 2.90
35 8.0 3.28
30 1.6 3.20
;
run;

dataset

data trans;
set hw;
z1=y1+y2+y3;
z2=2*y1-3*y2+2*y3;
z3=-y1-2*y2-3*y3;
run; proc print; run;

각 변수를 선형변환

data Z;
set trans;
drop y1-y3;
run; proc print; run;

원래 있던 거 버리기

proc corr data= z cov outp=Z_corr;
run;

공분산, 상관계수행렬 만들고 둘다 dataset으로 저장하기

data cov;
set Z_corr ;
if _TYPE_='COV';
keep z1-z3;
run;

공분산에 해당하는 행만 남기기

data corr;
set Z_corr ;
if _TYPE_='CORR';
keep z1-z3;
run;

상관계수에 해당하는 행만 남기기

proc iml;
use cov;
read all into A;
Det=det(A);
Trace=trace(A);
print(Det);
print(Trace);

det와 trace 계산하기

0개의 댓글