[의학통계방법론] Ch4. Measures of Variability and Dispersion

Measures of Variability and Dispersion

예제 데이터파일 다운로드

R 프로그램 결과

R 접기/펼치기 버튼

패키지

설치된 패키지 접기/펼치기 버튼
getwd()
## [1] "C:/Biostat"
library("Hmisc")
library("readxl")
library("ggplot2")
library("vegan")
library("dplyr")

엑셀파일불러오기

#모든 시트를 하나의 리스트로 불러오는 함수
read_excel_allsheets <- function(file, tibble = FALSE) {
  sheets <- readxl::excel_sheets(file)
  x <- lapply(sheets, function(X) readxl::read_excel(file, sheet = X))
  if(!tibble) x <- lapply(x, as.data.frame)
  names(x) <- sheets
  x
}

4장

4장 연습문제 불러오기

#data_chap04에 연습문제 4장 모든 문제 저장
data_chap04 <- read_excel_allsheets("data_chap04.xls")

#연습문제 각각 데이터 생성
for (x in 1:length(data_chap04)){
  assign(paste0('ex4_',1:length(data_chap04))[x],data_chap04[x])
  }

#연습문제 데이터 형식을 리스트에서 데이터프레임으로 변환
for (x in 1:length(data_chap04)){
  assign(paste0('ex4_',1:length(data_chap04))[x],data.frame(data_chap04[x]))
  }

EXAMPLE 4.1

#데이터셋
ex4_1
##   exam4_1.X1 exam4_1.X2
## 1        1.2        1.2
## 2        1.4        1.6
## 3        1.6        1.7
## 4        1.8        1.8
## 5        2.0        1.9
## 6        2.2        2.0
## 7        2.4        2.4
library(tibble)
sample1 <- ex4_1$exam4_1.X1 ; sample2 <- ex4_1$exam4_1.X2
f4_1 <- function(x) {
  x <- na.omit(x)
  n <- length(x) #빈도
  range <- max(x) - min(x) #범위
  mean <- mean(x) #평균
  iqr <- IQR(x, type=1) #IQR
  mdev <- round(sum(abs(x-mean(x)))/length(x),2) #평균편차
  var <- round(var(x), 4) #분산
  sd <- round(sd(x), 2) #표준편차
  sos <- sum((x-mean(x))^2) #Sum of Squares
  out <- data.frame(n=n, Mean=mean, Range=range, IQR=iqr, Mean_deviance=mdev, Variance=var, Standard_deviantion=sd, Sum_of_Squares = sos)
  return(out)
}
s1 <- f4_1(sample1) ; s2 <- f4_1(sample2)
nn <- tibble(data=c("Sample1","Sample2"))
s3 <- rbind(s1,s2) ; s4 <- data.frame(nn,s3)
s4
##      data n Mean Range IQR Mean_deviance Variance Standard_deviantion
## 1 Sample1 7  1.8   1.2 0.8          0.34   0.1867                0.43
## 2 Sample2 7  1.8   1.2 0.4          0.26   0.1367                0.37
##   Sum_of_Squares
## 1           1.12
## 2           0.82
 \(Sample \space 1\)\(Sample \space 2\)
Sample Size7g7g
Mean1.8g1.8g
Range1.2g1.2g
Interquartile Range0.8g0.4g
Mean Deviation0.34g0.26g
Variance0.1867g20.1367g2
Standard Deviation0.43g0.37g
Sum of Squares1.12g20.82g2
두 sample의 크기와 평균, 그리고 범위는 동일할 수 있으나, 사분위수 범위, 편차평균, 분산, 표준편차 등 다른 통계 값들이 차이가 있음을 알 수 있다.

범위는 가장 높은 측정값과 가장 낮은 측정값을 제외한 어떤 측정값도 고려하지 않는다는 점에서 비교적 조잡한 분산 측정값이다.

또한 표본이 모집단에서 가장 높은 값과 가장 낮은 값을 모두 포함할 가능성은 낮으므로 표본 범위는 일반적으로 모집단 범위를 과소평가(underestimate)한다.

따라서 표본 범위는 편향되고 비효율적인 추정치이다.

그럼에도 불구하고 일부에서는 표본 범위를 모집단 범위의 추정치(비록 좋지 않다.)로 제시하는 것이 유용한 것으로 간주하기도 한다.

예를 들어, 분류학자들(taxonomists)은 종종 모집단에서 가장 높은 값과 가장 낮은 값의 추정치를 갖는 것에 관심이 있다.

그러나 보고 데이터에 범위가 지정될 때마다 다른 분산 측정값들도 함께 보고하는 것이 좋다.

(범위는 순서형, 구간 및 비율 척도 데이터에 적용할 수 있다.)

EXAMPLE 4.2

#데이터셋
ex4_2
##   exam4_2.X1 exam4_2.X2
## 1        1.2        1.2
## 2        1.4        1.6
## 3        1.6        1.7
## 4        1.8        1.8
## 5        2.0        1.9
## 6        2.2        2.0
## 7        2.4        2.4
sample1 <- ex4_2$exam4_2.X1 ; sample2 <- ex4_2$exam4_2.X2
f4_2 <- function(x) {
  sumxi <- sum(x)
  sumxi2 <- sum(x^2)
  n <- length(x)
  xbar <- mean(x)
  ss <- sum(x^2)-(sum(x)^2/length(x))
  s2 <- (sum(x^2)-(sum(x)^2/length(x)))/(length(x)-1)
  s <-sqrt((sum(x^2)-(sum(x)^2/length(x)))/(length(x)-1))
  v <- (sqrt((sum(x^2)-(sum(x)^2/length(x)))/(length(x)-1)))/(mean(x))
  out <- data.frame(Sum_Xi=sumxi,Sum_xi2=round(sumxi2,2),n=n,Mean=xbar,SS=ss,s2=round(s2,4),s=round(s,2),V=round(v,2))
  return(out)
}
s1 <- f4_2(sample1) 
s2 <- f4_2(sample2)
nn <- tibble(data=c("Sample1","Sample2"))
s3 <- rbind(s1,s2);s4 <- data.frame(nn,s3)
s4
##      data Sum_Xi Sum_xi2 n Mean   SS     s2    s    V
## 1 Sample1   12.6    23.8 7  1.8 1.12 0.1867 0.43 0.24
## 2 Sample2   12.6    23.5 7  1.8 0.82 0.1367 0.37 0.21
 \(Sample \space 1\)\(Sample \space 2\)
Xi12.6g12.6g
Xi223.8g23.5g
\(Sample\space size\)7g7g
\(\overline X\)1.8g1.8g
SS1.12g21.12g2
s20.1867g20.1367g2
s0.43g0.37g
\(Coefficient \space of \space Variance\)24%21%
해당 데이터의 요약 통계량을 보면 두 데이터의 사이즈와 평균, 합은 같으나,
마지막에 변동계수를 보면 Sample1은 24%이고 Sample2는 21%이다.

이는 sample1의 변동이 sample2보다 크다는 것을 의미하며
변동계수는 산포의 정규화된 측도라 하며 평균에 대한 표준편차의 비로 정의한다.

변동계수를 구하는 식은 다음과 같다.
\[\begin{aligned} c_v = \frac{\sigma}{\mu}\space (모집단) \space \space \space \space \space \space\space\space \space\space \space \space \space \hat c_v = \frac{S}{\overline X} \space (표본) \end{aligned}\] 변동계수는 변동성의 측도로서 분산과 표준 편차는 데이터의 크기에 따라 크기가 달라진다.

(이는 데이터의 실제 크기나 측정 단위와는 별개로 상대적인 측정치임을 강조한다.)

변동 계수는 비율 척도 데이터에 대해서만 계산할 수 있다.
(예를 들어 섭씨 또는 화씨 온도 척도에서 측정된 온도 데이터의 변동 계수를 계산하는 것은 유효하지 않다.)

EXAMPLE 4.3

#데이터셋
ex4_3
##   exam4_3.Sites exam4_3.Sample1 exam4_3.Sample2 exam4_3.Sample3
## 1         Vines               5               1               2
## 2         Eaves               5               1               2
## 3      Branches               5               1               2
## 4      Cavities               5              17              34
다양성 지수 (Indicies of Diversity)란 특정 생태계의 종의 수나 인종의 다양성을 나타내는 지수로 주어진 사회(community)에서의 종의 다양성을 측정한 측도이다.

그 중 관련 지수로는 Shannon-Wiener diversity index *H*′ 가 있다.
\[\begin{aligned} H' = \frac{n \cdot \log\ n - \sum_{i=1}^{k} f_i \cdot \log f_i}{n} \space \space \space \space ,\space \space \space \space f_i &: the\ number\ of\ observations\ in\ each\ category\\ k &: the\ number\ of\ categories \end{aligned}\] *H*′의 규모는 데이터의 분포에 영향을 받을 뿐만 아니라 범주의 개수에도 영향을 받는다.

이론적으로, 최대 가능한 다양성 지수는 카테고리의 개수 *k* 로 구성되며 다음의 식으로 계산된다.
\[\begin{aligned} H'\_{max} &= \log k \end{aligned}\] 그래서 몇몇 전문가들은 다음 지수를 *H*′ 대신에 사용한다. \[\begin{aligned} J' &= \frac{H'}{H'\_{max}} \end{aligned}\] 해당 데이터의 다양성 지수를 구하면 다음과 같다.
library(vegan)
sam1 <- ex4_3$exam4_3.Sample1 ; sam2 <- ex4_3$exam4_3.Sample2 ; sam3 <- ex4_3$exam4_3.Sample3

f4_3 <- function(x) {
  n <- sum(x)
  H <- round(diversity(x,base=10),3)
  H_max <- round(log10(length(x)),3)
  J <- round(H / H_max,2)
  out <- data.frame(H=H, H_max = H_max, J=round(J,2))
  return(out)
}

h1<-f4_3(sam1) ; h2<-f4_3(sam2) ; h3<-f4_3(sam3)
nn <- tibble(data=c("Sample 1","Sample 2","Sample 3"))
h4 <- rbind(h1,h2,h3);h4 <- data.frame(nn,h4)
h4
##       data     H H_max    J
## 1 Sample 1 0.602 0.602 1.00
## 2 Sample 2 0.255 0.602 0.42
## 3 Sample 3 0.255 0.602 0.42
 \(Sample\ 1\)\(Sample\ 2\)\(Sample\ 3\)
\(Sample\ Size\)202040
\(H'\)0.6020.2550.255
\(H'_{max}\)0.6020.6020.602
\(J'\)10.420.42
*J*′ 같은 경우는 다중공선성을 나타내는 지표로도 알려져 있는데 그 이유는 카테고리의 개수에 따라 달라지기 때문이다.

데이터의 카테고리의 개수는 전형적으로 모집단으로부터 과소평가되는데 이는 데이터를 수집하는 경우에 몇몇의 카테고리를 수집하지 않을 수 있기 때문이다.

그러므로 종의 균등성을 나타내는 *J*′ 는 전형적으로 모집단의 종균등성의 과대평가되는 지표라 할 수 있다.

보통 종 부유도와 종 균등도가 클수록 *H*′ 가 증가하고 *J*′ 도 증가하는데
해당 데이터의 결과를 보면 Sample 1 의 *H*′는 0.6021이고 *J*′가 1이다.
나머지 Sample 2와 Sample 3sms 각각 *H*′가 0.255로 *J*′가 0.42로 Sample 1보다 작은것을 볼 수 있다.

*종 균등비율 높을수록, Shannon Index(다양성 지표)와 J’(균등도 지표) 커지는 것을 알 수 있다.*

EXAMPLE 4.4

#데이터셋
ex4_4
##   exam4_4.X1 exam4_4.code1 exam4_4.X2 exam4_4.code2 exam4_4.X3 exam4_4.code3
## 1        842             2     708964             4        800           8.0
## 2        843             3     710649             9        900           9.0
## 3        844             4     712336            16        950           9.5
## 4        846             6     715716            36       1100          11.0
## 5        846             6     715716            36       1250          12.5
## 6        847             7     717409            49       1300          13.0
## 7        848             8     719104            64         NA            NA
## 8        849             9     720801            81         NA            NA
##   exam4_4.X4 exam4_4.code4
## 1     640000         64.00
## 2     810000         81.00
## 3     902500         90.25
## 4    1210000        121.00
## 5    1562500        156.25
## 6    1690000        169.00
## 7         NA            NA
## 8         NA            NA
x1<-ex4_4$exam4_4.X1 ; code1 <- ex4_4$exam4_4.code1
x3 <- na.omit(ex4_4$exam4_4.X3) ; code3 <- na.omit(ex4_4$exam4_4.code3)
f4_4 <- function(x) {
  n <- length(x)
  sumx <- sum(x)
  ss <- sum(x^2)
  s2 <- round((ss - sumx^2 / n) / (n-1), 2)
  s <- round(sqrt(s2), 2)
  mean <- round(mean(x),1)
  v <- round(s / mean,4)
  out <- data.frame(sum = sumx, sum_of_squares = ss, Variance = s2, Standard_deviation=s, Mean=mean, CV=v)
  return(out)
}
nn <- tibble(data=c("X 1","Code 1","X 3","Code 3"))
vv <- rbind(f4_4(x1),f4_4(code1),f4_4(x3),f4_4(code3))
vv <- data.frame(nn,vv)
vv
##     data  sum sum_of_squares Variance Standard_deviation   Mean     CV
## 1    X 1 6765      5720695.0     5.98               2.45  845.6 0.0029
## 2 Code 1   45          295.0     5.98               2.45    5.6 0.4375
## 3    X 3 6300      6815000.0 40000.00             200.00 1050.0 0.1905
## 4 Code 3   63          681.5     4.00               2.00   10.5 0.1905
 \(Sample\ 1\)\(Sample\ 2\)
Sample Sizegg
Sum of X6765 g6300 g
Sum of X25720695 g26815000 g2
s25.98 g240000 g2
s2.45 g200 g
Mean845.6 g1050 g
CV0.29 %19 %
————————–——–
Sum of coding X45 g63 g
sum of coding X2295 g2681.5 g2
coding s25.98 g2g
coding s2.45 gg
coding Mean5.625 g10.5 g
coding CV44 %19 %
Sample 1 부터 살펴보면 코딩된 데이터와의 차이는 840만큼 차이가 나는데
(*A* =  − 840) 이는 원래 데이터의 평균에 *A* 만큼 더한 만큼 차이가나 동일하다.

Sample 2에서도 마찬가지로 *M* = 0.01 을 곱한 만큼 차이가나 동일한 것을 볼 수 있다.

차이점은 변동계수에서 난다.
두 데이터 모두 코딩 전 후의 분산 및 표준편차가 동일하지만 Sample 1 을 보면 변동계수의 차이가 나며
Sample 2와 같이 곱셈 및 나눗셈으로 코딩된 경우에는 차이가 나지 않음을 확인할 수 있다.

*상수 A를 더하거나 빼면 분산, 표준편차는 변하지 않지만,*

*상수 M을 곱하면 분산, 표준편차가 변하는 것을 알 수 있다.*


SAS 프로그램 결과

SAS 접기/펼치기 버튼

4장

LIBNAME ex 'C:\Biostat';
RUN;

/*4장 연습문제 불러오기*/
%macro chap04(name=,no=);
%do i=1 %to &no.;
	PROC IMPORT DBMS=excel
		DATAFILE="C:\Biostat\data_chap04"
		OUT=ex.&name.&i. REPLACE;
		RANGE="exam4_&i.$";
	RUN;
%end;
%mend;

%chap04(name=ex4_,no=4);

EXAMPLE 4.1

PROC IML;
use ex.ex4_1; read all; close ex.ex4_1;
%macro dis(x);
n= nrow(&x);
mean_x=mean(&x);
deviation1=&x-mean(&x);
abs_deviation = abs(deviation1);
deviation2= deviation1`*deviation1;
fq1 = round((nrow(&x)+1)/4);
q1= &x[fq1];
fq3=nrow(&x)+1 -round((nrow(&x)+1)/4);
q3=&x[fq3];
interquartile=q3-q1;
mean_deviation=round(mean(abs_deviation),0.01);
variance= round(sum(deviation2)/(nrow(&x)-1),0.0001);
standarddev=round(sqrt(variance),0.01);
print n mean_x deviation2 interquartile mean_deviation variance standarddev;
%mend;
%dis(x1);%dis(x2);
RUN;
QUIT;
SAS 출력

SAS 시스템

nmean_xdeviation2interquartilemean_deviationvariancestandarddev
71.81.120.80.340.18670.43
nmean_xdeviation2interquartilemean_deviationvariancestandarddev
71.80.820.40.260.13670.37

EXAMPLE 4.2

PROC IML;
use ex.ex4_2; read all; close ex.ex4_2;
%macro dis2(x);
sum_x=sum(&x);
sum_square=&x`*&x;
mean_x= mean(&x);
ss= sum_square - ((sum_x*sum_x)/nrow(&x));
samplevar_x = round(ss/(nrow(&x)-1), 0.0001);
samplestd_x = round(sqrt(samplevar_x), 0.01);
cv= round(samplestd_x / mean_x,0.01)*100;
print sum_x mean_x samplevar_x samplestd_x cv;
%mend;
%dis2(x1); %dis2(x2);
RUN;
QUIT;
SAS 출력

SAS 시스템

sum_xmean_xsamplevar_xsamplestd_xcv
12.61.80.18670.4324
sum_xmean_xsamplevar_xsamplestd_xcv
12.61.80.13670.3721

EXAMPLE 4.3

PROC IML;
use ex.ex4_3; read all; close ex.ex4_3;
totsum=repeat(0,5,1);
%macro ind(x);
%do i=1 %to 4 %by 1;
totsum[&i+1] = totsum[&i] + &x[&i]*log10(&x[&i]);
%end;
H = round(((sum(&x)*log10(sum(&x))) - totsum[nrow(sites)+1]) / sum(&x), 0.001);
H_max = round(log10(nrow(sites)), 0.001);
J = round(H/H_max, 0.001);
print H H_max J;
%mend;
%ind(x=sample1);
%ind(x=sample2);
%ind(x=sample3);
RUN;
QUIT;
SAS 출력

SAS 시스템

HH_maxJ
0.6020.6021
HH_maxJ
0.2550.6020.424
HH_maxJ
0.2550.6020.424

EXAMPLE 4.4

DATA ex.ex4_4_1;
    SET ex.ex4_4;
    IF x3='.' THEN DELETE;
    IF code3='.' THEN DELETE;
RUN;

PROC IML;
use ex.ex4_4; read all; close ex.ex4_4;
%macro cod1(x);
sum_x = sum(&x);
sum_sq = sum(&x`*&x);
ss_x = sum_sq - ((sum_x`*sum_x)/nrow(&x));
samplevar_x = round(ss_x/(nrow(&x)-1), 0.01);
samplestd_x = round(sqrt(samplevar_x), 0.01);
mean_x = round(mean(&x), 0.01);
cv = round(samplestd_x/mean_x * 100, 0.01);
print sum_x sum_sq ss_x samplevar_x samplestd_x mean_x cv;
%mend;
%cod1(x1);
%cod1(code1);
RUN;
QUIT;

PROC IML;
use ex.ex4_4_1; read all; close ex.ex4_4_1;
%macro cod2(x);
sum_x = sum(&x);
sum_sq = sum(&x`*&x);
ss_x = sum_sq - ((sum_x`*sum_x)/nrow(&x));
samplevar_x = round(ss_x/(nrow(&x)-1), 0.01);
samplestd_x = round(sqrt(samplevar_x), 0.01);
mean_x = round(mean(&x), 0.01);
cv = round(samplestd_x/mean_x * 100, 0.01);
print sum_x sum_sq ss_x samplevar_x samplestd_x mean_x cv;
%mend;
%cod2(x3);
%cod2(code3);
RUN;
QUIT;
SAS 출력

SAS 시스템

sum_xsum_sqss_xsamplevar_xsamplestd_xmean_xcv
6765572069541.8755.982.45845.630.29
sum_xsum_sqss_xsamplevar_xsamplestd_xmean_xcv
4529541.8755.982.455.6343.52

SAS 시스템

sum_xsum_sqss_xsamplevar_xsamplestd_xmean_xcv
6300681500020000040000200105019.05
sum_xsum_sqss_xsamplevar_xsamplestd_xmean_xcv
63681.5204210.519.05



교재: Biostatistical Analysis (5th Edition) by Jerrold H. Zar


**이 글은 22학년도 1학기 의학통계방법론 과제 자료들을 정리한 글 입니다.**