Come trasformare valori negativi in ​​logaritmi?


12

Vorrei sapere come trasformare valori negativi in Log(), poiché ho dati eteroschedastici. Ho letto che funziona con la formula Log(x+1)ma questo non funziona con il mio database e continuo a ottenere NaN come risultato. Ad esempio, ricevo questo messaggio di avviso (non ho inserito il mio database completo perché penso che con uno dei miei valori negativi sia sufficiente per mostrare un esempio):

> log(-1.27+1)
[1] NaN
Warning message:
In log(-1.27 + 1) : NaNs produced
> 

Grazie in anticipo

AGGIORNARE:

Ecco un istogramma dei miei dati. Sto lavorando con serie temporali paleontologiche di misurazioni chimiche, ad esempio la differenza tra variabili come Ca e Zn è troppo grande, quindi ho bisogno di un tipo di standardizzazione dei dati, ecco perché sto testando la log()funzione. inserisci qui la descrizione dell'immagine

Questi sono i miei dati non elaborati


2
Il logaritmo è definito solo per numeri positivi e viene solitamente utilizzato come trasformazione statistica su dati positivi in ​​modo che un modello conserverà questa positività. La log(x+1)volontà di trasformazione è definita solo per x > -1, poiché allora x + 1è positiva. Sarebbe bene conoscere il motivo per cui si desidera registrare per trasformare i dati.
Matthew Drury,

3
Dicci di più sui dati, inclusi intervallo, media, frequenze di valori negativi, zero e positivi. È possibile che un modello lineare generalizzato con collegamento log abbia più senso per i dati, purché sia ​​ragionevole pensare che la risposta media sia positiva. Potrebbe non essere affatto una trasformazione.
Nick Cox,

6
Grazie per l'aggiunta di dettagli. Per tali dati 0 ha un significato (uguaglianza!) Che dovrebbe essere rispettato, anzi preservato . Per questo e altri motivi vorrei usare le radici del cubo. In pratica, avrai bisogno di alcune variazioni sign(x) * (abs(x))^(1/3), i dettagli dipendono dalla sintassi del software. Per ulteriori informazioni sulle radici dei cubi, vedi ad esempio stata-journal.com/sjpdf.html?articlenum=st0223 (vedi esp. Pp.152-3). Abbiamo usato le radici dei cubi per aiutare la visualizzazione di una variabile di risposta che può essere positiva e negativa in natura .com / nature / journal / v500 / n7464 / full /…
Nick Cox il

8
Perché non stai trasformando le variabili originali invece delle differenze?
whuber

4
Hai risolto il problema matematico. Il suggerimento di @ whuber o le radici del cubo sarebbero ancora, credo, più facili da lavorare, specialmente se la costante è puramente empirica o varia tra le variabili. Una buona regola per la scelta delle trasformazioni è solo quella di utilizzare trasformazioni che funzionerebbero per dati simili che puoi immaginare. Quindi "funziona" per ma fallirebbe se il tuo prossimo batch fosse limitato da ..x > - 4 - 5log(x+4)x>45
Nick Cox

Risposte:


14

Poiché il logaritmo è definito solo per numeri positivi, non è possibile prendere il logaritmo di valori negativi. Tuttavia, se si intende ottenere una migliore distribuzione dei dati, è possibile applicare la seguente trasformazione.

Supponiamo che tu abbia distorto i dati negativi:

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

quindi puoi applicare una prima trasformazione per far risiedere i tuoi dati :(1,1)

z <- (x - min(x)) / (max(x) - min(x)) * 2 - 1
z <- z[-min(z)]
z <- z[-max(z)]
min(z); max(z)

e infine applicare la tangente iperbolica inversa:

t <- atanh(z)
plot(density(t))

Ora, i tuoi dati sembrano approssimativamente distribuiti normalmente. Questo è anche chiamato trasformazione di Fisher.


9
Hai risolto il problema matematico immediato. Ma non credo che molto probabilmente i consumatori di risultati statistici troverebbero facile pensare a come una scala di risposta e nella modellizzazione dovresti pensare a quale struttura di errore abbia senso. La scala sarebbe sensibile al minimo e al massimo empirici. atanh[(xmin(x))/(max(x)min(x))]
Nick Cox,

2
@NickCox Hai perfettamente ragione. Forse se l'OP aggiungesse ulteriori dettagli sul suo problema, potremmo trovare una soluzione alternativa!
Stochazesthai,

L'argomento interno nel mio primo commento non è ciò che si sta trasformando, ma lo spirito del mio commento è che penso che non sia influenzato.
Nick Cox,

Caro @stochazesthai, grazie per la tua spiegazione dettagliata, ma non posso applicare il tuo codice ai miei dati. Ho aggiornato la mia domanda con un link dei miei dati non elaborati alla fine.
Darwin PC

Le dichiarazioni z <- z[-max(z)]e si z <- z[-min(z)]riducono in modo inappropriato za un unico valore. Anche la funzione generale atanh(((x - min(x)) / (max(x) - min(x))))produce Infper i valori minimo e massimo di x.
Max Ghenis,

-1

Per trasformarlo in una scala di registro, prima trova il registro del numero positivo, quindi moltiplicalo per il suo segno, il seguente codice dovrebbe farlo.

transform_to_log_scale <- function(x){
    if(x==0){
        y <- 1
    } else {
        y <- (sign(x)) * (log(abs(x)))
    }
        y 
    }

Usando l'esempio sopra possiamo tracciare la seguente distribuzione distorta

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

inserisci qui la descrizione dell'immagine

Dopo aver usato la funzione di trasformazione come segue, otteniamo una distribuzione che sembra più "normale"

plot(density(sapply(x,FUN=transform_logs_scale)))

inserisci qui la descrizione dell'immagine


3
(1) La maggior parte dei linguaggi di programmazione ( Rinclusi) implementa la funzione signum (che restituisce -1 per numeri negativi, 1 per numeri positivi e 0 per zero). Usarlo sarebbe più espressivo e più veloce. (2) La tua proposta è scadente per l'analisi di dati come quelli illustrati, perché ha una discontinuità enorme a zero!
whuber

grazie per signum, non lo sapevo, mi chiedo come sia implementato
yosemite_k

3
Ci sono vari modi. In molte architetture di processori viene impostato un bit di segno dopo molte operazioni, quindi può essere utilizzato. Nella rappresentazione in virgola mobile a precisione doppia IEEE, il segno può essere trovato ispezionando un singolo bit (più un altro test rapido per uno zero reale). Nelle architetture pipeline con diramazione predittiva, ecc., Di solito è molto più efficiente non ramificarsi se possibile, motivo per cui l'uso della versione integrata di signum può essere un significativo guadagno computazionale. Per inciso, l'impostazione y <- 1quando sembra arbitraria - potrebbe davvero rovinare un'analisi statistica. x=0
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.