기하학적 평균: 내장되어 있습니까?
저는 기하학적 평균을 위해 내장된 것을 찾으려고 했지만 찾을 수 없었습니다.
(내장되어 있다고 해서 셸에서 작업하는 동안 시간이 절약되지는 않을 것이며 정확도에 차이가 있을 것 같지도 않습니다. 스크립트의 경우 내장된 기능을 최대한 자주 사용하여 (누적) 성능 향상이 두드러집니다.
없는 경우(아마도 그런 경우일 것입니다. 여기 제 것이 있습니다.
gm_mean = function(a){prod(a)^(1/length(a))}
아니요, 하지만 여기처럼 한 번 써본 사람이 몇 명 있어요.
또 다른 방법은 다음과 같습니다.
exp(mean(log(x)))
다음은 R의 기하학적 평균을 계산하기 위한 벡터화된 0 및 NA 허용 함수입니다.장황한 내용mean
을 포함한 계산.length(x)
다음의 경우에 필요합니다.x
양수가 아닌 값을 포함합니다.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
@ben-bolker에게 주목해 주셔서 감사합니다.na.rm
패스스루 및 @Gregor를 사용하여 올바르게 작동하는지 확인합니다.
제 생각에 일부 의견은 다음과 같은 허위 동등성과 관련이 있습니다.NA
데이터의 값과 0.제가 염두에 두고 있던 애플리케이션에서는 동일하지만, 물론 이것은 일반적으로 사실이 아닙니다.따라서, 0의 선택적 전파를 포함하고 싶다면, 다음을 처리합니다.length(x)
의 경우는 다르게NA
다음은 위의 기능에 대한 약간 더 긴 대안입니다.
gm_mean = function(x, na.rm=TRUE, zero.propagate = FALSE){
if(any(x < 0, na.rm = TRUE)){
return(NaN)
}
if(zero.propagate){
if(any(x == 0, na.rm = TRUE)){
return(0)
}
exp(mean(log(x), na.rm = na.rm))
} else {
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
}
또한 음수 값을 확인하고 보다 유용하고 적절한 값을 반환합니다.NaN
기하 평균이 음수 값에 대해 정의되지 않지만 0에 대해서는 정의됩니다.이것에 대해 제 사건을 계속 맡아주신 댓글 작성자분들께 감사드립니다.
우리는 심리 패키지를 사용하고 기하학적.평균 함수를 호출할 수 있습니다.
그
exp(mean(log(x)))
x에 0이 없으면 작동합니다. 그렇다면 로그는 항상 기하학적 평균이 0인 -Inf(-Infinite)를 생성합니다.
한 가지 해결책은 평균을 계산하기 전에 -Inf 값을 제거하는 것입니다.
geo_mean <- function(data) {
log_data <- log(data)
gm <- exp(mean(log_data[is.finite(log_data)]))
return(gm)
}
이렇게 하려면 한 줄기를 사용할 수 있지만 로그를 두 번 계산해야 하므로 비효율적입니다.
exp(mean(log(i[is.finite(log(i))])))
저는 마크가 말하는 그대로 사용합니다.이렇게 하면 태플리를 사용하더라도 내장된 기능을 사용할 수 있습니다.mean
함수, 정의할 필요가 없습니다!예를 들어, 데이터 $값의 그룹별 기하학적 평균을 계산하려면:
exp(tapply(log(data$value), data$group, mean))
EnvStats 패키지에는 geoMean 및 geoSd에 대한 기능이 있습니다.
이 버전은 다른 답변보다 더 많은 옵션을 제공합니다.
사용자는 (실제) 숫자가 아닌 결과와 사용할 수 없는 결과를 구별할 수 있습니다.만약 음수가 존재한다면, 답은 실수가 아닐 것입니다.
NaN
반환됩니다.그게 전부라면NA
함수는 값을입면함반환됩니다가수하력다니반▁will▁return▁values를 반환합니다.NA_real_
실제 가치는 문자 그대로 사용할 수 없다는 것을 반영하는 것입니다.이것은 미묘한 차이이지만 (약간) 더 강력한 결과를 산출할 수도 있습니다.파라미터는 " " " 입니다.
zero.rm
사용자가 0을 0으로 만들지 않고 출력에 0이 영향을 미치도록 하기 위한 것입니다.한다면zero.rm
으로 설정됨FALSE
그리고.eta
으로 설정됨NA_real_
(으)로 표시되며, 0은 1로 표시됩니다.저는 이것에 대한 이론적인 정당성을 가지고 있지 않습니다. 0을 무시하지 않고 결과를 0으로 만드는 것을 포함하지 않는 "무엇인가를 하는 것"이 더 말이 되는 것 같습니다.eta
는 다음 토론에서 영감을 얻은 0을 처리하는 방법입니다. https://support.bioconductor.org/p/64014/
geomean <- function(x,
zero.rm = TRUE,
na.rm = TRUE,
nan.rm = TRUE,
eta = NA_real_) {
nan.count <- sum(is.nan(x))
na.count <- sum(is.na(x))
value.count <- if(zero.rm) sum(x[!is.na(x)] > 0) else sum(!is.na(x))
#Handle cases when there are negative values, all values are missing, or
#missing values are not tolerated.
if ((nan.count > 0 & !nan.rm) | any(x < 0, na.rm = TRUE)) {
return(NaN)
}
if ((na.count > 0 & !na.rm) | value.count == 0) {
return(NA_real_)
}
#Handle cases when non-missing values are either all positive or all zero.
#In these cases the eta parameter is irrelevant and therefore ignored.
if (all(x > 0, na.rm = TRUE)) {
return(exp(mean(log(x), na.rm = TRUE)))
}
if (all(x == 0, na.rm = TRUE)) {
return(0)
}
#All remaining cases are cases when there are a mix of positive and zero
#values.
#By default, we do not use an artificial constant or propagate zeros.
if (is.na(eta)) {
return(exp(sum(log(x[x > 0]), na.rm = TRUE) / value.count))
}
if (eta > 0) {
return(exp(mean(log(x + eta), na.rm = TRUE)) - eta)
}
return(0) #only propagate zeroes when eta is set to 0 (or less than 0)
}
데이터에 결측값이 있는 경우 이는 드문 경우가 아닙니다.당신은 주장을 하나 더 추가해야 합니다.
다음 코드를 사용해 보십시오.
exp(mean(log(i[ is.finite(log(i)) ]), na.rm = TRUE))
exp(mean(log(x1))) == prod(x1)^(1/length(x1))
언급URL : https://stackoverflow.com/questions/2602583/geometric-mean-is-there-a-built-in
'source' 카테고리의 다른 글
오류: "%>%" 함수를 찾을 수 없습니다. (0) | 2023.07.01 |
---|---|
git 모든 파일을 체크아웃합니다. (0) | 2023.07.01 |
꺼내기 요청에서 수정된 파일 제거 (0) | 2023.07.01 |
_id 필드가 없는 mongoexport (0) | 2023.07.01 |
IIS가 있는 ASP.NET Core - HTTP 동사 허용되지 않음 (0) | 2023.07.01 |