2013-07-25 3 views
19

알고리즘 R의 평균 함수가 어떤 알고리즘을 사용하는지 알고 싶습니다. 이 알고리즘의 수치 속성에 대한 참고가 있습니까? 그것은 내가이 가정 무엇을 추가 그리고R은 평균을 계산하기 위해 어떤 알고리즘을 사용합니까?

for (i = 0; i < n; i++) s += REAL(x)[i]; 
s /= n; 

: do_summary() : 똑바로 평균을 보인다

case REALSXP: 
PROTECT(ans = allocVector(REALSXP, 1)); 
for (i = 0; i < n; i++) s += REAL(x)[i]; 
s /= n; 
if(R_FINITE((double)s)) { 
    for (i = 0; i < n; i++) t += (REAL(x)[i] - s); 
    s += t/n; 
} 
REAL(ans)[0] = s; 
break; 

나는 다음과 같은 C의 summary.c 코드 발견 데이터의 평균과의 평균 차이 인 것으로 보이는 수치 수정 :

for (i = 0; i < n; i++) t += (REAL(x)[i] - s); 
s += t/n; 

나는 추적 할 수 없었습니다. s 알고리즘은 어디서나 내려 질 수 있습니다 (평균은 훌륭한 검색 용어가 아닙니다).

도움을 주시면 감사하겠습니다.

+0

이것은 제쳐두지만, 'mean.R'은 'summary.c'를 어떻게 호출합니까? 나는 '내부 (mean (x))'가 'summary.c'를 호출하는 방법을 이해하지 못한다. 두 파일이 어떻게 연결되어 있는지 주셔서 감사합니다. 죄송합니다. 질문에서 너무 멀어지면 죄송합니다. 나는 다만 배우기를 희망하고있다. –

+3

@MarkMiller : 모든'.Internal' 호출은'src/main/names.c'에 매핑됩니다. 이 파일에서 "mean"을 검색하면 C 함수가 무엇을 호출하는지 볼 수 있습니다. 그런 다음 해당 C 함수에 대한 소스 파일을 검색 할 수 있습니다. [이 질문] (http://stackoverflow.com/q/13279256/271616)을 참조하십시오. –

+0

r-devel에서 이와 동일한 질문에 대한 링크 : https://stat.ethz.ch/pipermail/r-devel/2013-July/067053.html –

답변

14

이 알고리즘은 무엇인지 모르겠지만 Martin Maechler는 에 대한 응답으로 West, 1979의 업데이트 방법을 언급했으며 Brian Ripley가 R-2.3.0에서 구현했습니다. 사용 된 실제 알고리즘이 나열된 소스 코드 또는 버전 제어 로그에서 참조를 찾을 수 없습니다. 그것은 개정 37389에서 cov.c과 수정 37393에서 summary.c으로 구현되었습니다.

+0

올바른 방향으로 나를 가리켜 주셔서 감사합니다. 이 논문의 사본을 작성하십시오. – Zach

+1

+1'svn blame' –

+1

나는 웨스트의 방법이라고 생각하지 않습니다.방금 종이를 다운로드하고 West는 분산 계산을위한 원 패스 (one pass) 방법을 제안합니다. R은 평균 계산을 위해 2 단계 통과 방법을 사용합니다. – hadley

9

저는 R 알고리즘이 다음과 같이 작동한다고 생각합니다.

평균의 첫 번째 표준 계산은 부동 소수점 오류로 인해 대수 평균을 효과적으로 추정합니다 (누적되는 요소에서 합계가 멀어지면 악화됩니다).

두 번째 패스는 추정 된 평균과 요소의 차이를 합산합니다. 평균의 양쪽에있는 값의 균형이 맞아야하지만 차이점은 부동 소수점 오류입니다. 평균값과의 차이는 여전히 오류 가능성이 있지만 요소와 누적 합계 사이의 최악의 전위차보다 작아야합니다 (적어도 예상 평균 수명은 값 범위 내에서 어딘가에 있지만 합계는이를 벗어날 수 있음) . N으로 나누면 평균과의 평균 차이가 생기며,이를 사용하여 초기 평균값을 실제 평균에 더 가깝게 조정합니다. 이것을 반복하면 더 가깝고 가까워 질 수 있지만, 평균값과의 평균 차이를 계산할 때 부동 소수점 오류가 발생하면 어떤 점에서는 실패 할 것입니다. 나는 하나의 패스가 충분히 가깝습니다.

이것은 제 아내에게 설명되었습니다.

알고리즘의 출처가 어디인지 잘 모르겠습니다.이 방법을 Kahan 합계와 같은 다른 방법과 비교하는 방법이 확실하지 않습니다. 나는 약간의 테스트를해야 할 것 같아.

관련 문제