ゼロを含む非負のデータを変換するにはどうすればよいですか?


191

正のデータに大きな偏りがある場合、ログを取得することがよくあります。しかし、ゼロを含む非常に歪んだ非負データではどうすればよいですか?私は2つの変換が使用されているのを見ました:

  • log(x+1)0が0にマッピングされるというきちんとした機能を持つ。
  • log(x+c)ここで、cは推定されるか、非常に小さな正の値に設定されます。

他のアプローチはありますか?あるアプローチを他のアプローチよりも好む理由はありますか?


19
私は、答えに加えていくつかの他の材料のいくつかまとめましたrobjhyndman.com/researchtips/transformations
ロブHyndman

5
stat.stackoverflowを変換および促進する優れた方法!
ロビンジラール

はい、@ robingirardに同意します(Robのブログ投稿のため、ここにたった今到着しました)。
エリーケッセルマン

左打ち切りデータへのアプリケーションについては、stats.stackexchange.com / questions / 39042 /…も参照してください(現在の質問とまったく同じように、位置のシフトまで特徴付けることができます)。
whuber

2
そもそも変換の目的を述べずに変換する方法について尋ねるのは奇妙に思えます。状況はどうですか?変換する必要があるのはなぜですか?あなたが何を達成しようとしているのかわからない場合、どのように合理的に何かを提案できますか?(正確なゼロの(ゼロでない)確率の存在がゼロに分布におけるスパイクを意味するので明らか一方は、正常に変換することを望むことができない、何の変換スパイクなかった削除されます-それは、それを動き回ることができます。)
Glen_b 16

回答:


55

変換の最も適切な選択は、モデルとコンテキストに依存するように思えます。

「0」ポイントは、いくつかの異なる理由から発生する可能性があり、それぞれ異なる方法で処理する必要があります。

  • 切り捨て(ロビンの例のように):適切なモデル(たとえば、混合、生存モデルなど)を使用します
  • 欠損データ:データの代入/必要に応じて観測値の削除。
  • 自然なゼロ点(例:収入レベル;失業者の収入がゼロ):必要に応じて変換する
  • 測定器の感度:おそらく、データに少量を追加しますか?

あなたがゼロを持っているとき、普遍的な「正しい」変換はないと思うので、私は本当に答えを提供していません。


6
私の質問に対するすべての回答は有益な情報を提供してくれ、私はそれらすべてを支持しました。しかし、私は1つの答えしか選択できず、スリカントは最良の概要IMOを提供します。
ロブハインドマン

2
また、ゼロインフレモデル(余分なゼロといくつかのゼロを気にする場合:混合モデル)、およびハードルモデル(ゼロとあなたがゼロ以外を気にする場合:初期検閲モデルの2段階モデル​​)があることに注意してください。
ウェイン

82

逆双曲線正弦変換については誰も言及していません。したがって、完全を期すためにここに追加します。

これは、Box-Cox変換の代替であり、 ここで。値の場合、ゼロはゼロにマッピングされます。2パラメータBC変換と同様に、シフトを許可する2パラメータバージョンもあります。Burbidge、Magee and Robb(1988)は、推定を含むIHS変換について議論しています。θ > 0 θ θ

f(y,θ)=sinh1(θy)/θ=log[θy+(θ2y2+1)1/2]/θ,
θ>0θθ

IHS変換は、負の値とゼロを含む実際の行全体で定義されたデータで機能します。値が大きい場合、(0を除く)の値に関係なく、対数変換のように動作します。ような限定的なケースでは、ます。θ θ 0 F Y θ Yyθθ0f(y,θ)y

IHSの変革は、それよりもはるかによく知られているように思えます。


1
/ logistic変換の優れた代替手段のように見えるtanh
Firebug

1
IHSについては、一部意見が異なる
kjetil b halvorsen

3
その論文は逆双曲線正弦ではなく、逆正弦変換に関するものです。
ブライアン

42

変数が回帰の独立した要因として使用される場合の有用なアプローチは、変数を2つの変数で置き換えることです。1つはゼロかどうかのバイナリインジケーターで、もう1つは元の変数の値または再表現です。その対数など。この手法は、Hosmer&Lemeshowのロジスティック回帰に関する本で議論されています(他の場所でも間違いないでしょう)。元の変数の正の部分の切り捨てられた確率プロットは、適切な再表現を識別するのに役立ちます。(例については、https://stats.stackexchange.com/a/30749/919の分析を参照してください。)

変数が線形モデルの従属変数である場合、打ち切られた回帰(Tobitのような)が有用な場合があり、これも開始対数を生成する必要がありません。この手法は計量経済学者の間では一般的です。


1
ゼロ膨張ポアソンとしてのモデリングデータは、このアプローチの特殊なケースですか?
デビッドルバウアー

4
@Davidは、ZIPは独立変数ではなく従属変数のモデルであるため、似ているように見えますが、そうではありません。
whuber

1
@whuber この手法については、Hosmer&Lemeshowのロジスティック回帰に関する本で説明されています。私は彼らの本を見ていますが、正しいページを見つけられないようです
...-landroni

1
@landroni H&Lは当時新鮮だったので、この本にはこのトピックに関連する何かがあると確信しています。(私はいくつかの非常に大きな回帰モデルを開発するためにそれと相談しました、そして、多くの独立変数はこのように扱われなければなりませんでした。)しかし、私もこの時点で参照を見つけることができません。あなたが詳細を探している場合のために、私はこのテクニックについて次の記事で書きました。サイト検索に表示される2つはstats.stackexchange.com/questions/6563stats.stackexchange.com/questions/4831です。
whuber

1
@landroniはい、バイナリ変数のすべての数値エンコードが同等であるのと同じように、同等です。解釈に最も便利な方を選択してください。
whuber

37

シフト付きのログ変換は、Box-Cox変換の特殊なケースです。

y(λ1,λ2)={(y+λ2)λ11λ1when λ10log(y+λ2)when λ1=0

これらは負の値の拡張形式ですが、ゼロを含むデータにも適用できます。Box and Cox(1964)は、最尤法を使用しての適切な値を見つけるアルゴリズムを提示します。これにより、究極の変革が実現します。 λ

Box-Cox変換を好む理由は、線形モデルの仮定を保証するために開発されているからです。データを正規性に変換できない場合でも、推定が対称分布につながることを示すために、いくつかの作業が行われています。λ

これがあなたのデータにどれだけうまく対応しているかはわかりません、なぜならあなたが言及した単なるログ変換であるかもしれませんが、必要な推定して別の変換が適切です。λλ=(0,1)λ

Rでは、boxcox.fitパッケージ内の関数がgeoRパラメーターを計算します。


うーん、新しい行を受け入れるためにラテックスの「ケースを開始」することができません。:-/
アルス

@ars開始ケースを使用するようにeqnsを修正しました。このプロセスでeqnsを破壊しなかったことを願っています。

1
@ロブ:ああ、ごめんなさい。DiggleのgeoRを使用する方法がありますlambda2=TRUEが、の引数で指定しますboxcox.fit。(回答も更新されました。)
ars

3
@ gd047:ここに素敵なリファレンスですelevatorlady.ca/doc/refcard/expressions.html
ARS

6
この関数に何が起こったのかと疑問に思ってこれを読んでいる人のために、今では呼ばれていboxcoxfitます。
ストラグ

19

それはまったく異なる質問なので、ゼロ!=欠落データがあると仮定しています。

多重線形回帰でゼロを処理する方法を考えるとき、実際にゼロがいくつあるかを考える傾向がありますか?

数個のゼロのみ

かなり大きなデータセットに単一のゼロがある場合、次の傾向があります。

  1. ポイントを削除し、ログを取り、モデルに適合させる
  2. ポイントに小さなを追加し、ログを取得してモデルに適合させるc

モデルの適合は変化しますか?パラメーター値はどうですか?モデルがポイントの削除に対してかなり堅牢な場合、を追加するための迅速で汚れたアプローチに進みます。c

この手順を少し粗雑にせず、arsの回答に記載されているシフトでboxcoxメソッドを使用できます。

多数のゼロ

データセットに多数のゼロが含まれている場合、単純な線形回帰は仕事に最適なツールではないことが示唆されます。代わりに、混合モデリングのようなものを使用します(SrikantとRobinが提案したとおり)。


15

すばやく汚れたものが必要な場合は、平方根を使用してみませんか?


7
多くの場合、キューブルート変換はうまく機能し、ゼロとネガを許可します。たとえば、測定が単位体積あたりの体積または粒子の数である場合、キューブルートが特にうまく機能することがわかりました。キューブルートは、それを線形ディメンションに変換します。より柔軟なアプローチは、制限された3次スプライン(自然スプライン)を立方根または平方根に当てはめることです。これにより、想定された形式から少し逸脱することができます。
フランクハレル

2
+1。キューブルートに関する小さな記事については、stata-journal.com / article.html?article = st0223を参照してください(これは2014年第1四半期から無料の.pdfになります。)
Nick Cox

2
ゼロの平方根はゼロであるため、ゼロ以外の値のみが変換されます。ゼロが膨らんだ場合、これはスパイクに対処しません。また、グループ内でそれぞれが異なる量のゼロを持っている場合、深刻な問題を引き起こす可能性があります。言い換えると、いくつかのグループに多くのゼロがあり、他のグループにほとんどない場合、この変換は多くのことに悪影響を及ぼします。分散が最大のグループ(ゼロが最小のグループ)の場合、ほとんどすべての値が変換されます。対照的に、ゼロが最も多いものは、多くの値が変換されません。これにより、どのグループの分散が最大になるかを変更できます。
D_Williams

@D_Williamsで記述されている場合、変換は分散を維持しません。この場合、混合モデル(このスレッドの別の場所で言及)がおそらく適切なアプローチでしょう。
MKT

10

連続データがあると思います。

データにゼロが含まれている場合、これはゼロのスパイクがあることを意味します。これは、データの特定の側面に起因する可能性があります。たとえば、風力エネルギーでは、2 m / s未満の風がゼロ電力を生成し(カットインと呼ばれます)、25 m / sを超える風(ゼロ付近)がゼロ電力を生成します(セキュリティ上の理由から、カットオフと呼ばれます) 。生成された風力エネルギーの分布は連続しているように見えますが、ゼロのスパイクがあります。

私の解決策: この場合、ゼロのスパイクと、分布の連続部分に使用する予定のモデル(wrbes Lebesgue)の混合で作業することにより、ゼロを個別に扱うことをお勧めします。


9

@RobHyndmanで提供された回答と、負の値に拡張されたlog-plus-one変換を次の形式で比較します。

T(x)=sign(x)log(|x|+1)
r = -1000:1000

l = sign(r)*log1p(abs(r))
l = l/max(l)
plot(r, l, type = "l", xlab = "Original", ylab = "Transformed", col = adjustcolor("red", alpha = 0.5), lwd = 3)

#We scale both to fit (-1,1)
for(i in exp(seq(-10, 100, 10))){
  s = asinh(i*r)

  s = s / max(s)
  lines(r, s, col = adjustcolor("blue", alpha = 0.2), lwd = 3)
}
legend("topleft", c("asinh(x)", "sign(x) log(abs(x)+1)"), col = c("blue", "red"), lty = 1)

ご覧のとおり、が増加すると、変換はステップ関数のようになります。、ログ・プラス・ワンの変換によく似ています。そしてときそれが近づきライン。θθ1θ0

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


編集:対数変換は同様に任意のスケールに変更でき、同様の結果が得られることに注意してください。前の回答に基づいて、が同様の結果をもたらすものを示したかっただけです。両方のアプローチの最大の違いは、に近い領域です。これは、それらの導関数からわかります。θx=0


8

2パラメーターフィットBox-Coxが提案されているため、入力データをフィットし、任意の関数を実行して(時系列予測など)、反転出力を返すRを次に示します。

# Two-parameter Box-Cox function
boxcox.f <- function(x, lambda1, lambda2) {
  if (lambda1!=0) {
    return(((x + lambda2) ^ lambda1 - 1) / lambda1)
  } else {
    return(log(x + lambda2))
  }
}

# Two-parameter inverse Box-Cox function
boxcox.inv <- function(x, lambda1, lambda2) {
  if (lambda1!=0) {
    return((lambda1 * x + 1) ^ (1 / lambda1) - lambda2)
  } else {
    return(exp(x) - lambda2)
  }
}

# Function to Box-Cox transform x, apply function g, 
# and return inverted Box-Cox output y
boxcox.fit.apply <- function(x, g) {
  require(geoR)
  require(plyr)

  # Fit lambdas
  t <- try(lambda.pair <- boxcoxfit(x, lambda2=T)$lambda)

  # Estimating both lambdas sometimes fails; if so, estimate lambda1 only
  if (inherits(t, "try-error")) {
    lambda1 <- boxcoxfit(x)$lambda
    lambda2 <- 0
  } else {
    lambda1 <- lambda.pair[1]
    lambda2 <- lambda.pair[2]
  }
  x.boxcox <- boxcox.f(x, lambda1, lambda2)

  # Apply function g to x.boxcox. This should return data similar to x (e.g. ts)
  y <- aaply(x.boxcox, 1, g)

  return(boxcox.inv(y, lambda1, lambda2))
}

5

Yが、各アメリカ人が特定の年に新車に費やす金額(合計購入価格)であるとします。Yは0でスパイクします。0から約12,000の間の値はまったくありません。主に10代、20代、30代に他の値を取ります。予測変数は、そのような購入を行う必要性および/または関心のレベルのプロキシになります。購入しなかった個人にとって、必要性や関心はゼロとはほとんど言えません。これらのスケールでは、非購入者はYよりも購入者にはるかに近いか、Yのログでさえも示唆します。このようなケースではありますが、ヘルスケアでは、テストセット/トレーニングセットの相互検証によって判断される最も正確な予測は、昇順で得られることがわかりました。

  1. Yのバイナリバージョンでのロジスティック回帰
  2. YのOLS、
  3. Yの順序回帰(PLUM)は5つのカテゴリに分類されています(購入者を4つの等しいサイズのグループに分割するため)。
  4. 5つのカテゴリに分類されたYの多項ロジスティック回帰
  5. Yのlog(10)のOLS(キューブルートを試すことを考えていませんでした)、および
  6. YのOLSは5つのカテゴリに分類されました。

連続従属変数のこの分類に反発する人もいます。ただし、一部の情報は犠牲になりますが、分類は状況の重要な基礎となる側面を復元することで役立ちます。ここでも、「ゼロ」はYが示すよりもはるかに類似しています。


4
また、2つのモデルに分割することもできます。車を購入する確率(バイナリ応答)と、購入した車の価値です。これは、保険、信用リスクなど、多くの分野での標準的な慣行です
大井紅14

1
@HongOoi-このアプローチがいつ適用できるか、または適用できないかについての参考資料を提案できますか?
rolando2 14

4

ここで説明するヨージョンソンのパワー変換には、Box Coxのパワー変換の強みを活用しながらゼロとネガを処理するように設計された優れたプロパティがあります。これは、ゼロまたは負のデータを扱っているときによく行くことです。

Yeo-Johnsonが望ましい理由を説明する、賛否両論の変換の概要を以下に示します。

ログ

長所:肯定的なデータでうまく機能します。

短所:ゼロを処理しません。

> log(0)
[1] -Inf

ログプラス1

長所:プラス1オフセットは、正のデータに加えてゼロを処理する機能を追加します。

短所:負のデータで失敗する

> log1p(-1)
[1] -Inf
> log1p(-2)
[1] NaN
Warning message:
In log1p(-2) : NaNs produced

平方根

長所:ゼロと正のデータを処理できる累乗変換を使用します。

短所:負のデータで失敗する

> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced

ボックスコックス

Rコード:

box_cox <- function(x, lambda) {

    eps <- 0.00001
    if (abs(lambda) < eps)
        log(x)
    else
        (x ^ lambda - 1) / lambda

}

長所:拡張された電力変換が可能

短所:ゼロとネガの問題に苦しんでいます(つまり、ポジティブデータのみを処理できます)

> box_cox(0, lambda = 0)
[1] -Inf
> box_cox(0, lambda = -0.5)
[1] -Inf
> box_cox(-1, lambda = 0.5)
[1] NaN

ヨ・ジョンソン

Rコード:

yeo_johnson <- function(x, lambda) {

    eps <- .000001
    not_neg <- which(x >= 0)
    is_neg  <- which(x < 0)

    not_neg_trans <- function(x, lambda) {
        if (abs(lambda) < eps) log(x + 1)
        else ((x + 1) ^ lambda - 1) / lambda
    }

    neg_trans <- function(x, lambda) {
        if (abs(lambda - 2) < eps) - log(-x + 1)
        else - ((-x + 1) ^ (2 - lambda) - 1) / (2 - lambda)
    }

    x[not_neg] <- not_neg_trans(x[not_neg], lambda)

    x[is_neg] <- neg_trans(x[is_neg], lambda)

    return(x)

}

長所:正、ゼロ、負のデータを処理できます。

短所:考えられることはありません。プロパティはBox-Coxと非常に似ていますが、ゼロおよび負のデータを処理できます。

> yeo_johnson(0, lambda = 0)
[1] 0
> yeo_johnson(0, lambda = -0.5)
[1] 0
> yeo_johnson(-1, lambda = 0.5)
[1] -1.218951

1
Yeo–Johnsonの短所:正と負、およびラムダの両側の値、魔法のチューニング値(イプシロン、およびラムダとは何ですか?)の複雑な個別の変換。Fireboxの答えに示されている単純な負の拡張ログ変換と比べて、明らかな利点はありません(Box-Coxのように)スケーリングされた累乗変換が必要な場合を除きます。
コンラッドルドルフ

1

回帰モデルでゼロのログを処理する方法を明確にするために、最良の解決策と実際に人々が犯すよくある間違いを説明する教育論文を書きました。また、この問題に対処するための新しいソリューションも考案しました。

ここをクリックして、論文を見つけることができます:https : //ssrn.com/abstract=3444996

まず、なぜログ変換を使用するのか不思議に思うはずです。回帰モデルでは、ログとログの関係により、弾力性が識別されます。実際、もし、次にの弾性に対応するの。ログは、理論モデルを線形化することもできます。また、不均一分散を減らすためにも使用できます。ただし、実際には、ログで取得された変数に正でない値が含まれることがよくあります。log(y)=βlog(x)+εβyx

しばしば提案される解決策は、なるように、すべての観測値正の定数cを追加することです。ただし、線形回帰とは異なり、対数線形回帰は従属変数の線形変換に対してロバストではありません。これは、対数関数の非線形性によるものです。ログ変換は、低い値を拡張し、高い値を絞り込みます。したがって、定数を追加すると、ゼロとデータ内の他の観測値との(線形)関係が歪められます。定数によって生成されるバイアスの大きさは、実際にはデータ内の観測範囲に依存します。そのため、可能な限り最小の定数を追加することは、必ずしも最良の最悪のソリューションではありません。YY+c>0

この記事では、非常に小さな定数を追加すると実際に最高のバイアスが提供される例を示します。バイアスの表現を導き出します。

実際、ポアソン擬似最尤法(PPML)は、この問題の良い解決策と見なすことができます。次のプロセスを考慮する必要があります。

yi=aiexp(α+xiβ)E(ai|xi)=1

このプロセスは、いくつかの機能が動機となっています。まず、半ログモデルとして同じ解釈を提供します。第二に、このデータ生成プロセスは、従属変数のゼロ値の論理的合理化を提供します。この状況は、乗算誤差項がゼロに等しい場合に発生する可能性があります。第三に、PPMLを使用してこのモデルを推定しても、場合に計算上の困難は発生しません。と仮定すると、ます。この瞬間の二次誤差を最小化して、次の1次条件を導きます。βaiyi=0E(ai|xi)=1E(yiexp(α+xiβ)|xi)=0

i=1N(yiexp(α+xiβ))xi=0

これらの条件は、場合でも定義され。これらの1次条件は数値的にポアソンモデルの条件と同等であるため、任意の標準的な統計ソフトウェアで推定できます。yi=0

最後に、実装も簡単で、不偏推定量を提供する新しいソリューションを提案します。単に推定する必要があります:β

log(yi+exp(α+xiβ))=xiβ+ηi

この推定量は偏りがなく、標準統計ソフトウェアを使用してGMMで簡単に推定できることを示します。たとえば、Stataで1行のコードを実行するだけで推定できます。

この記事がお役に立てば幸いです。皆様からのフィードバックをお待ちしております。

クリストフ・ベレゴとルイ・ダニエル・パプ・クレスト-エコール・ポリテクニック-ENSAE

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