R-Blogger블로그·해설한국어2009-08-17
R에서 Cox‑Stuart 검정을 이용한 추세 분석
R에서 Cox-Stuart 테스트를 이용한 추세 분석Cox-Stuart 테스트는 검정력이 소소(검정력 = 0.78)하지만 추세 분석에 매우 강건합니다. 따라서 다양한 상황에 적용하여 획득한 값의 변화를 파악하는 데 유용합니다. 이 방법은 이항분포를 기반으로 합니다. R에는 Cox-Stuart 테스트를 수행하는 함수가 없으므로, 테스트의 기초가 되는 논리적 단계를 살펴보고 마지막에 직접 함수를 작성할 수 있습니다.예를 들어, 레스토랑의 일일 고객 수가 증가하거나 감소하는 추세가 있는지 판단하고 싶습니다. 15일 동안의 고객 수는 다음과 같습니다:customers: 5, 9, 12, 18, 17, 16, 19, 20, 4, 3, 18, 16, 17, 15, 14이 테스트를 수행하려면 관측치 수가 짝수여야 합니다. 현재 관측치는 15개이므로 (N+1)/2번째 관측치를 삭제합니다 (여기서는 값이 20인 관측치):customers = c(5, 9, 12, 18, 17, 16, 19, 20, 4, 3, 18, 16, 17, 15, 14) length(customers)[1] # 15 cust_even = customers[ -(length(customers)+1)/2 ] length(cust_even)[1] # 14이제 14개의 관측치가 남았으므로 다음 단계로 넘어갑니다. 관측치를 두 벡터로 나눕니다: 첫 번째는 앞쪽 7개, 두 번째는 뒤쪽 7개입니다.fHalf = cust_even[1:7] sHalf = cust_even[8:14] fHalf # [1] 5 9 12 18 17 16 19 sHalf # [1] 4 3 18 16 17 15 14두 벡터를 차례로 빼서 차이를 구합니다.difference = fHalf - sHalf difference # [1] 1 6 -6 2 0 1 5차이의 부호만을 고려합니다. 0이 포함되면 제거합니다.signs = sign(difference) signs # [1] 1 1 -1 1 0 1 1 signs = signs[ signs != 0 ] signs # [1] 1 1 -1 1 1 1이제 양수와 음수 부호의 개수를 셉니다.pos = signs[signs 0] neg = signs[signs작은 부호 개수를 선택합니다. 이 경우 음수 부호가 1개이므로 선택합니다. 이항분포를 사용해 N=6번 시행 중 x=1개의 성공이 일어날 확률을 계산합니다.pbinom(1, 6, 0.5)[1] # 0.109375계산된 값이 0.05보다 크므로(95% 신뢰수준을 사용함) 유의미한 추세가 없다고 결론지을 수 있습니다(음수 부호가 적으므로 감소 추세가 예상되었으나 유의미하지 않음). 값이 0.05보다 작았다면 유의미한 추세가 있다고 받아들입니다.이제 회귀 모델을 맞춰 기울기의 p-값을 관찰해 보겠습니다.customers = c(5, 9, 12, 18, 17, 16, 19, 20, 4, 3, 18, 16, 17, 15, 14) days = 1:length(customers) model = lm(customers ~ days) summary(model)Call: lm(formula = customers ~ days) Residuals: Min 1Q Median 3Q Max -11.09 -2.17 1.35 3.97 6.47 Coefficients: Estimate Std. Error t value Pr(|t|) (Intercept) 11.3048 3.1104 3.634 0.00303 ** days 0.2786 0.3421 0.814 0.43014 Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 5.724 on 13 degrees of freedom계수 b가 유의미하지 않음을 확인했습니다.직접 작성한 Cox-Stuart 테스트 함수cox.stuart.test =function (x){ method = "Cox-Stuart test for trend analysis" leng = length(x) apross = round(leng) %% 2 if (apross == 1) { delete = (length(x)+1)/2 x = x[ -delete ] } half = length(x)/2 x1 = x[1:half] x2 = x[(half+1):(length(x))] difference = x1-x2 signs = sign(difference) signcorr = signs[signs != 0] pos = signs[signs0] neg = signs[signs
원문 URL
전체 글은 원문 페이지에서 이어서 읽을 수 있습니다.
- 작성자
- R-Blogger
- 출처
- R-Blogger
- 플랫폼
- R-Blogger
- 분류
- 블로그·해설
- 언어
- 한국어
- 발행일
- 2009-08-17