Применение преобразования Фишера и избегание значений Inf - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь создать некоторые функции в R на основе этого короткого документа.

https://www.mesasoftware.com/papers/TheInverseFisherTransform.pdf

Сначала я нормализовал данные в диапазоне от -1 до 1. Затем я применяю уравнение. Проблема возникает, когда самые высокие и самые низкие значения становятся -Inf и Inf из функции нормализации.

> log((1 + +1) / (1 - +1))
[1] Inf
> log((1 + -1) / (1 - -1))
[1] -Inf

В настоящее время у меня есть:

set.seed(1234)
data <- rnorm(10000, mean = 10, sd = 20)    # randomly generate some data

negPosOneNormalisation <- function(x){
  2 * ((x - min(x)) / (max(x) - min(x))) - 1        # normalise data -1 and 1
}

normalised_data <- negPosOneNormalisation(data)     # data is now between -1 and 1 bounds

FisherTransform <- function(x){
  (0.5) * log((1 + x) / (1 - x))                    # Apply equation (1) from paper
}

fisher_data <- FisherTransform(normalised_data)     

sum(is.infinite(fisher_data))                      # results give two Inf values

InverseFisherTransform <- function(x){
  y = FisherTransform(x)
  inv_y = (exp**(2*y) - 1) / (e**(2*y) + 1)        # apply equation (2) from paper
}

InverseFisherTransform(fisher_data)                # returns and error due to the Inf values

Как я могу применить такую ​​нормализацию функция, где максимум не совсем равен -1 или +1, но может быть -0,9999 и +0,99999 или некоторое количество эпсилон выше или ниже крайних значений.

Я не хочу изменять входные данные, но что-то вроде следующие действия остаются в силе:

negPosOneNormalisation <- function(x){
  2 * ((x +/- epsilon - min(x +/- epsilon)) / (max(x +/- epsilon) - min(x +/- epsilon))) - 1        # normalise data -1 and 1
}

Как применить эту функцию, чтобы избежать проблем -Inf и + Inf?

1 Ответ

1 голос
/ 28 марта 2020

Как насчет преобразования вашего Inf или -Inf в 0,9999 или -0,9999 после преобразования Фишера?

Вы можете легко сделать это с помощью

fisher_data[which(fisher_data==Inf)]<-0.9999
fisher_data[which(fisher_data==-Inf)]<--0.9999
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...