以下に示す私の従属変数は、私が知っている在庫分布に適合しません。線形回帰は、奇妙な方法で予測Yに関連するやや非正規の右スキューの残差を生成します(2番目のプロット)。最も有効な結果と最高の予測精度を得るための変換またはその他の方法に関する提案はありますか?可能であれば、たとえば5つの値(たとえば、0、lo%、med%、hi%、1)に分類することを避けたいと思います。
以下に示す私の従属変数は、私が知っている在庫分布に適合しません。線形回帰は、奇妙な方法で予測Yに関連するやや非正規の右スキューの残差を生成します(2番目のプロット)。最も有効な結果と最高の予測精度を得るための変換またはその他の方法に関する提案はありますか?可能であれば、たとえば5つの値(たとえば、0、lo%、med%、hi%、1)に分類することを避けたいと思います。
回答:
打ち切り回帰のメソッドは、このようなデータを処理できます。 彼らは、残差が通常の線形回帰のように振る舞うと仮定しますが、
(左打ち切り):データに依存しない(ただし、ケースごとに異なる可能性がある)低しきい値よりも小さい値はすべて定量化されていません。および/または
(右打ち切り):データに依存しない(ただし、ケースごとに異なる可能性がある)高しきい値よりも大きい値はすべて、定量化されていません。
「定量化されていない」とは、値がそのしきい値を下回る(または上回る)かどうかを知ることを意味しますが、それだけです。
フィッティング方法は通常、最尤法を使用します。ベクトルXに対応する応答モデルが次の形式の場合
IIDと共通の分布を有するF σは、 PDFが持つF σ(ここで、σは未知の「迷惑パラメータ」である)、次いで、 -検閲の非存在下で-観測値の対数尤度を(X I、Y I)であります
本発明を検閲して、我々は、クラスを(おそらく空の)三つにケースを分割することができる:インデックスののN 1、Y iが含まれて下限閾値の値とを表す左側打ち切りデータを、インデックスのI = N 1 + 1のN 2、Y iは定量化されます。残りのインデックスについては、y iは上限しきい値を含み、右打ち切りを表しますデータ。対数尤度は、以前と同じ方法で取得されます。これは、確率の積のログです。
これは関数として数値的に最大化されます。
私の経験では、そのような方法は、半分以下のデータが打ち切られたときにうまく機能します。そうしないと、結果が不安定になる可能性があります。
R
censReg
パッケージを使用した簡単な例は、大量のデータがあってもOLSと検閲結果が(大きく)異なる場合があることを示しています。問題のデータを定性的に再現します。
library("censReg")
set.seed(17)
n.data <- 2960
coeff <- c(-0.001, 0.005)
sigma <- 0.005
x <- rnorm(n.data, 0.5)
y <- as.vector(coeff %*% rbind(rep(1, n.data), x) + rnorm(n.data, 0, sigma))
y.cen <- y
y.cen[y < 0] <- 0
y.cen[y > 0.01] <- 0.01
data = data.frame(list(x, y.cen))
:通知に重要なものはパラメータであり、真の勾配がある、真の切片がある- 0.001、そして真のエラーSDはある0.005。
との両方lm
を使用censReg
して、行に合わせましょう。
fit <- censReg(y.cen ~ x, data=data, left=0.0, right=0.01)
summary(fit)
この打ち切り回帰の結果はprint(fit)
、
(Intercept) x sigma
-0.001028 0.004935 0.004856
fit.OLS <- lm(y.cen ~ x, data=data)
summary(fit.OLS)
与えられたOLSフィットは、print(fit.OLS)
であり、
(Intercept) x
0.001996 0.002345
summary
比較のために、回帰を定量化されたデータに制限しましょう。
fit.part <- lm(y[0 <= y & y <= 0.01] ~ x[0 <= y & y <= 0.01])
summary(fit.part)
(Intercept) x[0 <= y & y <= 0.01]
0.003240 0.001461
さらに悪いことに!
状況をいくつかの写真にまとめています。
lineplot <- function() {
abline(coef(fit)[1:2], col="Red", lwd=2)
abline(coef(fit.OLS), col="Blue", lty=2, lwd=2)
abline(coef(fit.part), col=rgb(.2, .6, .2), lty=3, lwd=2)
}
par(mfrow=c(1,4))
plot(x,y, pch=19, cex=0.5, col="Gray", main="Hypothetical Data")
lineplot()
plot(x,y.cen, pch=19, cex=0.5, col="Gray", main="Censored Data")
lineplot()
hist(y.cen, breaks=50, main="Censored Data")
hist(y[0 <= y & y <= 0.01], breaks=50, main="Quantified Data")
値は常に0と1の間ですか?
もしそうなら、ベータ分布とベータ回帰を検討するかもしれません。
ただし、データにつながるプロセスをよく考えてください。0および1の膨張モデルを実行することもできます(0膨張モデルは一般的です。おそらく、自分で1膨張モデルに拡張する必要があります)。大きな違いは、これらのスパイクが正確な0と1の多数を表す場合、または0と1に近い値だけを表す場合です。
最良のアプローチを決定するには、地元の統計学者(データの出所の詳細を議論できるように秘密保持契約)と相談するのが最善かもしれません。
Greg Snowのアドバイスと一致して、ベータモデルはそのような状況でも有用であると聞きました(Smithson&verkuilen、2006、A Better Lemon Squeezerを参照)、および分位回帰(Bottai et al。、2010)床と天井の効果が非常に顕著であるように思われます(特にベータ回帰)。
別の代替案は、打ち切られた回帰モデルのタイプ、特にTobit Modelを考慮することです。ここでは、観測された結果が、連続する(そしておそらく正常な)潜在的な潜在変数によって生成されると考えます。ヒストグラムを考えると、この基礎となる連続モデルが合理的であるとは言いませんが、分布を見ると(床を無視して)、楽器の値が低いほど密度が高く、ゆっくりと高くなるのを見ることができます値。
幸運なことに、検閲は非常に劇的であるため、極端なバケット内で多くの有用な情報を回復することを想像するのは困難です。あなたのサンプルのほぼ半分が床と天井のビンに入っているように思えます。