source

기하학적 평균: 내장되어 있습니까?

ittop 2023. 7. 1. 10:02
반응형

기하학적 평균: 내장되어 있습니까?

저는 기하학적 평균을 위해 내장된 것을 찾으려고 했지만 찾을 수 없었습니다.

(내장되어 있다고 해서 셸에서 작업하는 동안 시간이 절약되지는 않을 것이며 정확도에 차이가 있을 것 같지도 않습니다. 스크립트의 경우 내장된 기능을 최대한 자주 사용하여 (누적) 성능 향상이 두드러집니다.

없는 경우(아마도 그런 경우일 것입니다. 여기 제 것이 있습니다.

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 패키지에는 geoMeangeoSd에 대한 기능이 있습니다.

이 버전은 다른 답변보다 더 많은 옵션을 제공합니다.

  • 사용자는 (실제) 숫자가 아닌 결과와 사용할 수 없는 결과를 구별할 수 있습니다.만약 음수가 존재한다면, 답은 실수가 아닐 것입니다.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

반응형