負の値を対数に変換する方法は?


12

Log()異分散データがあるため、負の値をに変換する方法を知りたいです。私はそれが式で動作することを読みましたLog(x+1)が、これは私のデータベースでは動作せず、結果としてNaNを取得し続けます。たとえば、この警告メッセージが表示されます(負の値のいずれかで例を示すのに十分だと思うため、完全なデータベースを配置しませんでした)。

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

前もって感謝します

更新:

これが私のデータのヒストグラムです。化学測定の古生物学の時系列で作業しています。たとえば、CaとZnなどの変数の差が大きすぎる場合、何らかのタイプのデータ標準化が必要ですlog()。そのため、関数をテストしています。 ここに画像の説明を入力してください

これは私の生データです


2
対数は正の数値に対してのみ定義され、通常、モデルがこの正の性質を保持するように、正のデータの統計変換として使用されます。log(x+1)変換だけのために定義されますx > -1その後として、x + 1正です。データを変換するログを作成する理由を知っておくといいでしょう。
マシュードゥルーリー

3
範囲、平均、負、ゼロ、正の値の頻度など、データについて詳しく教えてください。平均応答が正であると考えることが合理的である限り、ログリンクを使用した一般化線形モデルがデータにとって最も意味があると考えられます。それはあなたがまったく変身してはいけないということかもしれません。
ニックコックス

6
詳細を追加していただきありがとうございます。そのようなデータの場合、0には意味があり(平等!)尊重されるべきであり、実際に保存されます。そのため、その他の理由から、キューブルートを使用します。実際には、sign(x) * (abs(x))^(1/3)ソフトウェアの構文に応じて詳細を変更する必要があります。立方根の詳細は、例えば参照してくださいstata-journal.com/sjpdf.html?articlenum=st0223(ESP参照。pp.152-3)我々使用立方根の中に正と負になることができ、応答変数のヘルプ可視化への自然.com / nature / journal / v500 / n7464 / full /…
ニックコックス

8
違いの代わりに元の変数を変換しないのはなぜですか?
whuber

4
ログバツ+4バツ>45

回答:


14

対数は正の数に対してのみ定義されるため、負の値の対数を取ることはできません。ただし、データの分散を改善することを目的としている場合は、次の変換を適用できます。

負のデータが歪んでいるとします:

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

11

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

最後に逆双曲線正接を適用します。

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

これで、データはほぼ正規分布しているように見えます。これはフィッシャー変換とも呼ばれます。


9
アタン[バツバツ/最大バツバツ]

2
@NickCoxあなたは絶対に正しいです。OPが彼の問題に関する詳細を追加した場合、別の解決策を見つけられるかもしれません!
stochazesthai

私の最初のコメントの内なる議論は、変換されているものではありませんが、私のコメントの精神は影響を受けないと思います。
ニックコックス

親愛なる@stochazesthai、あなたの詳細な説明に感謝しますが、私のデータにあなたのコードを適用することはできません。最後に生データのリンクで質問を更新しました。
ダーウィンPC

ステートメントz <- z[-max(z)]z <- z[-min(z)]不適切にz単一の値に縮小します。また、一般関数atanh(((x - min(x)) / (max(x) - min(x))))Infの最小値と最大値に対して生成しますx
マックスゲニス

-1

それを対数目盛に変換するには、最初に正の数の対数を見つけてからその符号を乗算します。次のコードでそれを行う必要があります。

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

上記の例を使用して、次の歪んだ分布をプロットできます

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

ここに画像の説明を入力してください

次のように変換関数を使用すると、より「正規」に見える分布が得られます

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

ここに画像の説明を入力してください


3
(1)ほとんどのプログラミング言語(同R梱)はsignum関数を実装します(負の数に対して-1、正の数に対して1、ゼロに対して0を返します)。それを使用すると、表現力が増し、高速になります。(2)あなたの提案は、図解されているようなデータを分析するための貧弱な提案です。なぜなら、それはゼロで大きな不連続性を持っているからです!
whuber

signumのおかげで、私はそれについて知りませんでした、それがどのように実装されるのだろうか
-yosemite_k

3
y <- 1バツ=0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.