분류 전체보기 (317)

반응형

직접 표준화


  • 비교하고자하는 집단의 연령별 측도(발생률, 유병률, 사망률 등)는 알려져있지만, 표준화된 인구에서는 어떨지 알아보고 싶을 때 사용한다.
  • 표준화된 인구 구조가 미리 정해져있어야한다. 
  • 표준화된 인구 구조를 정하는 방법에도 여러가지가 있는데, 한국이면 주로 한국 표준 인구를 사용한다. 또는 세계인구를 사용할 수도 있다.


방법 )


1. A집단과 B집단의 연령별 사망률을 알아보고자 할 때, 두 집단 별로 사망률을 표준 인구에 대입시켜 표준 인구에서의 연령별 기대 빈도수를 계산한다.

2. 연령별 기대 빈도수를 모두 합한 후, 표준 집단의 총 인구수로 나누어 표준화율을 구한다.

3. 두 집단의 표준화율을 비교하여 어떤 집단의 사망률이 더 높은지를 판단한다.



간접 표준화


  • 간접 표준화의 경우, 특히 어떤 집단의 발생률, 사망률 등이 표준 집단에 비해 높은지, 낮은지를 판단하기 위해서 사용한다.
  • 또는 두 집단의 발생률, 사망률 등을 비교할 때도 쓰인다.
  • 간접 표준화 방법실제 관찰된 사건 수기대사건 수비교하는 방법이다.
  • (실제 관찰된 사건 수) / (기대사건수) = SIR (또는 사망률일 경우 SMR) 이라고 한다.
  • SIR = Standardized Incidence Ratio, SMR = Standardized Mortality Ratio 의 약자이다.
  • 만약 어떤 집단의 발생률이 표준 집단에 비해 높은 경우 SIR > 1일 것이고, 낮은 경우 SIR < 1 일 것이다.
  • 이 SIR에 표준화 발생률을 곱하면 간접 표준화 발생률이 된다.
  • 즉, 간접표준화발생률 = SIR * 표준화발생률

직접 표준화 방법에 비해 간접표준화 방법이 가지는 방법의 이점

  • 특정 집단의 전체 율만 아는 경우
  • 연령별 율의 신뢰도가 적은 경우
  • 사망자수나 발생자 수가 워낙 적어 값이 불안정한 경우

위와 같은 경우에 간접 표준화 방법은 직접 표준화 방법에 비해 더욱 안정적이고 보수적인 값을 제공한다.

직접 표준화 방법과 간접 표준화 방법의 차이를 직관적으로 정리하면 직접 표준화 방법에서는 비교하고자하는 집단의 발생률을 표준 집단에 가져가서 표준집단에서 기대 발생자수를 구하고, 간접 표준화 방법에서는 표준 집단의 발생률을 비교하고자하는집단으로가져가 기대 발생자수를 구한다. 

직접 표준화 방법의 경우 비교하고자하는 집단의 발생률을 표준 집단으로 가져가는 것이기 때문에 비교하고자하는 집단의 발생률이 불안정하면 안된다. 예를 들어 비교하고자하는 집단의 사람 수가 너무 적다면, 예를 들어 희귀병이 3명중 1명이 발생하였으면 발생률이 0.33이 되어서 이 값은 불안정한 값이된다. 따라서 표본의 수, 발생자 수가 적다면 간접 표준화 방법을 쓰는것이 더 안정적이다. 


간접 표준화 방법 예시


그냥 보기에는 Area2가 사망률이 높아보인다. (5.1% vs 4.1%) 그러나 잘 보면 Area2가 전체적인 연령이 높은 것을 알 수 있다. 이 경우 간접표준화 방법을 이용하여 연령을 보정해보자.



표준 인구집단을 선정한다. 표준 인구집단은 많은 경우에 '대한민국 표준인구'를 사용하지만 이 경우에는 Area1+Area2를 통해 표준 인구를 구성한다. 이렇게 구한 표준 인구의 사망률은 4.6%이다.



Area1과 Area2의 연령별 기대 사망자수를 구한다. 기댓값은 (사람수)x(표준화사망률)로 구한다. 
Area1의 기대 사망자수는 37.79 명이고, Area2의 기대 사망자수는 54.21명이다.

따라서, 
Area1의 SMR = 41/37.79 = 1.08
Area2의 SMR = 51/54.21 = 0.94 이다. 

절대적으로는 Area2의 사람이 더 많이 죽었지만 표준화된 인구를 고려했을 때, Area2의 상대적으로 많이 죽었음을 알 수 있다.

마지막으로 간접표준화사망률을 구하면

Area1의 간접표준화사망률 = 4.6% * 1.08 = 5.0%
Area2의 간접표준화사망률 = 4.6% * 0.94 = 4.3%



참고

http://www.dartmouthatlas.org/downloads/methods/indirect_adjustment.pdf



반응형
반응형

이 포스트는 아래 포스팅을 참고한 포스팅입니다.

https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/


Jupyter Notebook


기존에는 IPython Notebook으로 알려졌던 Jupyter Notebook은 코드, 이미지, 분석 결과, 코멘트, 수식 등을 분석자가 "노트북"처럼 Keep할 수 있게하여 다른 사람들이 분석의 흐름을 읽기 쉽게 만들 수 있는 유연하고 강력한 툴입니다. Jupyter Notebook은 여러가지 언어를 지원합니다. (Python, R, Julia 등) 또한 어떤 컴퓨터에서든지 쉽게 호스팅할 수 있습니다. http나 ssh로 접속하기만 하면 됩니다. 또 무엇보다도 Jupyter Notebook은 무료입니다. IPython 프로젝트에서부터 시작된 Juypter Notebook는 Julia, Python, R의 앞 글자를 따시 지어졌고, 파이썬 이외의 여러가지 언어를 지원하기 위하여 시작되었습니다. 주피터에서 파이썬 코드를 실행할 때 내적으로는 IPython Kernel이 돌아가게 됩니다.


1. 키보드 단축키


Help > Keyboard Shortcuts에 가면 키보드 단축키들을 확인할 수 있습니다. 아시다시피 키보드 단축키는 개발에서 시간을 많이 단축해줍니다. 위 메뉴를 주피터가 업데이트될 때마다 확인하시면 좋은데, 키보드 단축키들이 자주 추가되기 때문입니다.


또는 Cmd + Shift + P (또는 Ctrl + Shift + P 리눅스, 윈도우의 경우) 을 누르면 대화창이 뜨는데 키보드 단축키들을 이름으로 검색해서 실행시킬 수 있습니다. 키보드 단축키가 생각나지 않으실 때는 이 기능을 활용하시면 좋습니다.


몇 가지 유용한 단축키롤 소개합니다. 


esc : command 모드로 변경한다.


command 모드 안에서

  • A : 현재 셀의 위에 새로운 셀을 추가한다.
  • B : 현재 셀 밑에 새로운 셀을 추가한다.
  • M : 현재 셀을 markdown 모드로 변경한다. 
  • Y : markdown 모드를 다시 code 모드로 변경한다.
  • D+D : 현재 셀을 삭제한다.
  • Enter : command 모드에서 edit 모드로 변경한다.
  • F : 코드를 find and replace 한다.
  • O : Output을 toggle한다.
shift + tab : 객체의 docstring(documentation)을 출력한다. 

복수의 셀을 선택하기
  • Shift J 나 Shift down(키보드 방향키)을 누르면 아래방향으로 복수의 셀을 선택할 수 있다. Shift K나 Shift Up을 누르면 위 방향으로 복수의 셀을 선택한다. 
  • 복수의 셀이 선택되면 마찬가지로 delete, copy, cut, paste, run을 할 수 있다. 
  • Shift M을 누르면 선택된 셀들을 merge 한다.

2. 변수를 이쁘게 출력하기


가장 널리쓰이는 방법은 print 문을 안 쓰고 그냥 변수명만 셀에 쓴 다음에 run을 하는 것입니다. 그러면 IPython Kernel이 해당 객체를 이쁘게 나타내주는데 예를 들어 pandas DataFrame을 출력할 때 유용한 방법입니다. 


덜 알려진 방법은 kernel 의 세팅을 바꾸면 여러개의 변수명에 대해서 output을 내줄 수 있다는 것인데

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import pandas as pd


위와 같이 세팅하면


data = pd.DataFrame({'a':("A", "B","C","D","E","F","G"), 'b':(1,2,3,4,5,6,7)}) data.head() data.tail()

Out[11]:
ab
0A1
1B2
2C3
3D4
4E5
Out[11]:
ab
2C3
3D4
4E5
5F6
6G7


위와 같이 여러개의 statement가 있어도 그 statement의 수만큼의 output을 내줍니다. (세팅을 안 하게 되면 가장 마지막 output 만 나타내줍니다.)


~/.ipython/profile_default/ipython_config.py

 

일일이 세팅을 해주기 귀찮으면 위의 코드를


c = get_config()

# Run all nodes interactively
c.InteractiveShell.ast_node_interactivity = "all"

이렇게 바꾸어주면 일일이 코드상에서 세팅해주지 않아도 됩니다.



3. 라이브러리 도큐먼트를 쉽게 찾기


Help 메뉴에 가시면 Scipy, Numpy, Matplotlib, Pandas와 같은 흔히 쓰이는 라이브러이의 도큐먼트를 확인할 수 있습니다. 또한 코드상에서 ? 접두사를 붙여서 라이브러리의 도큐먼트를 확인할 수도 있습니다.


?str.replace()


Docstring:
S.replace(old, new[, count]) -> str

Return a copy of S with all occurrences of substring
old replaced by new.  If the optional argument count is
given, only the first count occurrences are replaced.
Type:      method_descriptor




반응형
반응형

SAS - Signed Rank Sum Test



Dataset


아래 데이터는 대두콩군과 천식군 내에 CD3+ T-cell의 개수를 나타낸 데이터이다.

대두콩군과 천식군의 CD3+ T-cell에 유의미한 차이가 있는지 알아보자.


Code


proc import datafile = '/folders/myshortcuts/myFolders/data/asthma.txt' out=asthma replace;
run;
proc univariate data =asthma normal;
run;
proc npar1way data=asthma wilcoxon;
 class group;
 exact wilcoxon;
 var x;
run;



결과



proc univariate 로 정규성 검정결과 표본이 정규분포를 따르지 않는다고 결론내린다. 또한 두 그룹이 독립적이므로 Wilcoxon rank sum test를 한다.




proc npar1way는 비모수 검정을 위한 프로시져이다. 결과는 위와 같다.

signed rank sum test의 귀무가설은 '그룹간의  값들의 중위수에는 차이가 없다.'이다.

p-value가 0.05보다 작으므로 유의수준 5% 내에서 귀무가설을 기각하고, 그룹간에 유의미한 차이가 있다고 결론 내린다. 



반응형
반응형

SAS를 통한 비모수 검정


1. Paired Sample에 대한 Sign Test와 Signed Rank Test 



위 데이터셋은 특정 공군부대에 배치된 14명 신병들의 치주에서 부착상실을 보인 위치들에 대한 백분율을 비교한 자료이다.

치료전(before)과 치료후(after)의 변화를 보고 해당 치료법이 부착상실을 치료하는 효과가 있는지를 평가해보자. 이 경우 한 사람에 대해 Before과 After를 측정했으므로 해당 sample은 paired 되어있다고 말한다.


two-related sample에 대한 비모수 검정은 sign test signed-rank test가 있다. 이 두 가지 검정을 모두 하는 PROC UNIVARIATE 프로시져를 사용한다. 


proc import datafile = '/folders/myshortcuts/myFolders/data/attachment.txt' out=attachment replace;
run;
data attachment;
 set attachment;
 diff = before-after;
run;
proc univariate data=attachment normal;
 var diff;
run


proc univariate 의 normal 옵션을 주면 data에 대한 정규성 검정을 한다. 정규성 검정의 결과를 보면 p-value < 0.05로 매우 작으므로 유의수준 5% 내에서 정규분포를 따르지 않는다. (p-value가 낮다는 것은 그만큼 귀무가설을 기각하는 쪽으로 힘이 실린다.) 표본이 정규분포를 따르지 않으므로 모수적 검정보다는 비모수적 검정을 하는 것이 좋다.

two-related sample에 대한 비모수 검정은 sign test와 signed-rank test가 있다.


univariate 내부에 var diff; 를 입력하면 diff에 대한 비모수 검정을 하게된다. (diff = before-after)

'부호'라고 표시된 부분이 sign test이고 '부호 순위'라고 표시된 부분이 signed-rank test이다.


sign test와 signed-rank test의 귀무가설은 diff의 중위수 = 0 이다. 이 때의 p 값은 sign test에서 0.0923이고 signed-rank test에서 0.0942 이므로 두 개의 검정 모두 유의수준 5% 내에서 귀무가설을 기각하지 못한다.




반응형
반응형


Data set



위의 Data set에서 age가 0~10일 때는 1, 10~20일 때는 2 ... 90~100 일 때는 9인 새로운 범주형 변수를 생성하고자 한다.


Code


/* 연령 category */
data workshop.data3(replace=yes);
    set workshop.data3;
    do i = 0 to 9;
        if age >= i*10 & age < i*10+10 then cage = i;
    end;
    drop i;
run;




Do end문과 if then 문을 통하여 위와 같이 간단하게 구현할 수 있다. 마지막으로 SAS 는 임시변수도 Data set 내부에 변수로 저장하므로 drop i; 를 통해 임시변수를 없애준다.




반응형
반응형

Data set



Code


/* Get Age */
data workshop.data3;
    set workshop.data3;
    birth = input(substr(regnum,1,6), YYMMDD6.);
    today = today();
    age  = int((today-birth)/365.25);
    drop birth today;
run;


  • 우선 substr 함수를 사용해 주민등록번호의 앞자리만 자른 후, 이것을 input 함수를 이용해  YYMMDD6. Informat으로 읽어들여 Numeric으로 변환하여 birth 변수에 저장한다. 
  • today 함수는 오늘 날짜를 numeric으로 돌려준다. 이 숫자 변수는 1960년 1월 1일부터 현재까지의 날짜의 차이를 뜻한다.
  • age는 오늘 날짜에서 출생날짜를 뺀 후 365.25로 나누어준다. 그리고 만 나이이므로 int 함수를 통해 소숫점을 잘라내서 정수로 만들어 준다.
  • 마지막으로 사용한 임시변수 birth, today를 drop해준다.




반응형
반응형

titanic.csv


SAS - (4) PROC FREQ 빈도 분석


PROC FREQ는 빈도분석을 할 때 쓰인다. 


데이터 읽고 솔팅하기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;

proc sort data = titanic;
    by sex;
run;



PROC FREQ


문법은 아래와 같다.


PROC FREQ DATA = Dataset ;
TABLES Variable_1 ;
BY Variable_2 ;



예제 


proc FREQ data=titanic;
    tables survived; 
    by sex;
run;


결과


FREQ 프로시저

Survived빈도백분율누적
빈도
누적
백분율
08125.808125.80
123374.20314100.00

FREQ 프로시저

Survived빈도백분율누적
빈도
누적
백분율
046881.1146881.11
110918.89577100.00


참고


https://www.tutorialspoint.com/sas/sas_frequency_distributions.htm

반응형
반응형

Relative Risk 와 Odds Ratio의 정의


 

 disease

non-disease 

 

 smoker 

20 (a)

80 (b)

100 

 non-smoker 

5 (c)

95 (d)

100 

 

25 

175 

200 


 

Relative Risk는 Risk Ratio 라고도 부르며 줄여서 RR 이라고 부르기도 합니다. 이름에서 알 수 있듯 RR은 Risk의 '비' 를 뜻합니다. 예를 들어, 위 표에서 smoker의 disease에 대한 Risk는 20/100 = 0.2 입니다. 즉 smoker인 경우 질병에 걸릴 확률이 0.2라는 것입니다. 반면 non-smoker의 disease에 대한 Risk는 5/100 = 0.05 입니다. 따라서 smoking의 disease에 대한 Relative Risk는 0.2/0.05 = 4 라고 할 수 있습니다. 이를 식으로 표현하면 (a/a+b)/(c/c+d) 입니다. Relative Risk는 직관적입니다. 담배를 폈을 경우 4배 더 질병에 걸릴 확률이 높다. 라고 직관적으로 해석할 수 있습니다. 


odds ratio는 OR 이라고 부르며 odds의 '비율' 입니다. 따라서 odds ratio를 알기 전에 우선 odds가 무엇인지 알아야합니다. odds는 실패와 성공의 비입니다. 위의 경우에는 smoker의 질병에 대한 odds는  20/80 = 0.25 이고 non-smoker의 질병에 대한 odds는 5/95 = 0.052 입니다. 따라서 odds ratio는 0.25/0.052 는 약 4.8입니다. 이를 수식으로 표현하면 (a/b)/(c/d) = 4.8 입니다. 값을 구하는건 구하는 건데 odds ratio는 직관적으로 해석하기 어렵습니다.



왜 Odds Ratio를 쓸까?


위와 같은 상황 (어떠한 처리군들 간에 질병에 대한 비교를 할 경우) RR을 써도 OR을 써도 상관없습니다. 하지만 중요한 것은 case-control study에서는 relative risk를 쓸 수 없습니다. 즉, case-control study에서는 OR만 씁니다.



Case Control Study란 무엇인가?


Case Control Study는 사례대조연구라고 하는데 우선 네이버 백과에서 정의를 살펴보겠습니다.


연구대상군의 특성을 명확히 하고 그 기본적 구조를 명백히 하기 위해 몇가지 요인을 조절한 대상 control을 골라 제각기 거기에 대해서 동일내용 및 방법으로 조사ㆍ연구를 하는 일종의 비교연구 법이다. [네이버 백과]


말이 어렵게 되어있는데 예를 들어 다음과 같은 상황입니다. 위에서는 smoker 100명, non-smoker 100명을 뽑아서 이들간에 질병의 발생률을 비교했죠. 하지만 아래와 같은 경우에는 병에 걸린사람 100명, 병에 걸리지 않은 사람 100명을 뽑았습니다.  (위에서 병에 걸린 사람의 smoker와 non-smoker의 비가 4:1으므로 여기서도 4:1 정도일 것입니다.) 이렇게 환자군과 대조군을 뽑아서 비교하는 것을 case-control study라고 합니다. 질병의 발생률이 매우 낮은 경우에는 이러한 study가 위와 같은 코호트 연구보다 좋습니다. 


 

 disease

non-disease 

 

 smoker 

80 (a)

45 (b)

 125

 non-smoker 

20 (c)

55 (d)

 75

 

100

100

200


이 경우 smoker의 risk를 구해보면 80/125입니다. 그대로 해석하면 약 65%의 환자가 흡연자가 병에 걸린다는 것입니다. 이는 모순입니다. 왜냐하면 병에 걸린 사람 100명, 병에 걸리지 않은 사람을 100명을 대상으로 RR을 계산한 것이니 병에 걸릴 위험율이 높게 나올 수 밖에 없겠죠. 실제로 RR을 구하면 (80/125) / (20/75) = 2.4 입니다. 샘플이 바뀌면, RR도 바뀐다는 것을 알 수 있습니다. 따라서 이러한 경우에는 RR을 쓸 수 없습니다. 하지만 case-control study에서 OR은 유효합니다. (80/45)/(20/55) = 약 4.91이 나옵니다. 따라서 OR이 RR 보다 더욱 범용적이라고 할 수 있습니다. 


또한 OR은 RR의 근사치로 사용되기도 합니다. OR = (a/b)/(c/d)이고 RR = (a/(a+b))/(c/(c+d)) 입니다. 따라서 a, c가 매우 작은 값이라면 OR을 RR에 근사시킬 수 있습니다. 그러므로 이러한 근사를 사용하면 위와 같은 case-control study에서도 OR을 근사해 RR을 알아볼 수 있는 것입니다.



반응형
반응형

/*

(3) Standard Deviation 구하기

날짜 : 2017.3.8

*/



데이터 읽기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;



표준편차 구하기


표준편차도 PROC MEANS 프로시져로 구할 수 있다. 옵션으로 STD를 주면 되며, 산술 평균 구하는 것과 마찬가지로 그루핑 할 수도 있다.

 

PROC MEANS data=work.titanic STD MAXDEC=2;
RUN;



MEANS 프로시저

변수표준편차
PassengerId
Survived
Pclass
Age
Parch
Fare
257.35
0.49
0.84
13.00
0.81
49.69

SORTING


우선 SEX로 그루핑하여 AGE의 Standard Deviation을 구하기에 앞서 SORTING을 먼저한다. 


proc sort data=work.titanic;
    by sex;
run;




PROC SUVEYMEANS


조금 더 Advanced 된 것으로 PROC SURVEYMEANS 프로시져가 있다. 아래는 SEX로 Grouping하여 age의 Standard Deviation을 구하는 예제이다. ods output을 통해 결과를 table로 내보낼 수 있다.


proc surveymeans data=work.titanic STD;
var age;
BY sex; /* 이 때 sex로 sorting이 되어 있어야 한다. */
ods output statistics=rectangle;
run;

proc print data=rectangle;
run;


The SURVEYMEANS Procedure

Data Summary
Number of Observations314
Statistics
VariableStd Error
of Sum
Age228.303304

The SURVEYMEANS Procedure

Distribution of Age

The SURVEYMEANS Procedure

Data Summary
Number of Observations577
Statistics
VariableStd Error
of Sum
Age312.416021

The SURVEYMEANS Procedure

Distribution of Age

OBSSexVarNameStdDev
1femaleAge228.303304
2maleAge312.416021



참고


https://www.tutorialspoint.com/sas/sas_standard_deviation.htm

반응형
반응형

/*

개발환경 : SAS University Edition

날짜 : 2017. 3. 8

*/



(2) PROC SQL로 새로운 테이블 만들기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;

PROC SQL;
create table titanic_male as
    SELECT *
     FROM 
        work.titanic
            WHERE sex = 'male'
;
RUN;



PROC SQL 입력후 SQL 문으로 새로운 테이블을 생성하는 문장을 넣으면 된다. 위처럼 입력하면 타이타닉 예제에서 sex가 male인 row들만 모아서 새로운 테이블을 만든다. 컬럼을 선택하려면 SELECT column1, column2 처럼 넣으면 된다. 위 스크립트를 실행 후에 work 라이브러리에 가보면 titanic_male이라는 이름의 테이블이 새로 생성되었음을 확인할 수 있다.



출처


https://www.tutorialspoint.com/sas/sas_standard_deviation.htm

반응형
반응형