線形回帰がうまく適合しない


9

R lm関数を使用して線形回帰を行います。

x = log(errors)
plot(x,y)
lm.result = lm(formula = y ~ x)
abline(lm.result, col="blue") # showing the "fit" in blue

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

しかし、それはうまく適合しません。残念ながら、私はマニュアルを理解できません。

誰かが私を正しい方向に向けてこれをよりよく合わせることができますか?

フィッティングとは、二乗平均平方根誤差(RMSE)を最小限に抑えたいという意味です。


編集:関連する質問(同じ問題です)をここに投稿しました: この機能に基づいてRMSEをさらに下げることはできますか?

そしてここに生データ:

http://tny.cz/c320180d

ただし、このリンクでは、 xは現在のページのエラーと呼ばれ、サンプルが少ない(現在のページのプロットでは1000と3000)。他の質問ではもっと簡単にしたかったのです。


4
R lmは期待どおりに機能します。問題はデータにあります。つまり、この場合、線形関係は適切ではありません。
mpiktas 2014年

2
取得する必要があると思う線と、線のMSEが小さいと思う理由を教えてください。あなたのyは0と1の間にあるので、線形回帰はこれらのデータには非常に適さないように思えます。値は何ですか?
Glen_b-モニカを復元する14

2
y値が確率である場合、OLS回帰はまったく必要ありません。
Peter Flom

3
(申し訳ありませんが、これを投稿することができます)以下の「より良い適合」のように見えるのは、(おおよそ)直交距離の平方和を最小化することであり、垂直距離の直観が誤っているのではありません。おおよそのMSEを簡単に確認できます。y値が確率されている場合は、より良い1までの範囲0外に出ていないいくつかのモデルによって提供されると思い
Glen_b -Reinstateモニカ

2
この回帰は、いくつかの外れ値の存在によって影響を受けている可能性があります。ロバスト回帰のケースである可能性があります。en.wikipedia.org/wiki/Robust_regression
Yves Daoust 2014年

回答:


18

最も単純なソリューションの1つは、小さい確率(0.1など)またはその補数が小さい確率(0.9など)の変化は、通常、中程度の確率(0.5など)の変化よりも意味があり、重みが大きいことを認識しています。

たとえば、0.1から0.2に変更すると、(a)確率が2倍になり、(b)補完確率が1/9だけ変更されます(1-0.1 = 0.9から1-0.2から0.8にドロップ)、0.5からの変更0.6にすると、(a)確率が20%だけ増加しますが、(b)補完確率は20%だけ減少します。多くのアプリケーションでは、最初の変更は2番目の変更のほぼ2倍であると見なされます。

(何かが発生する)確率またはその補数(つまり、発生しない何かが発生する確率)を使用することが同様に意味がある状況では、この対称性を尊重する必要があります。

p1pppp/p(1p)/(1p)p

z=logplog(1p),
pz
p=exp(z)/(1+exp(z)).

この推論はかなり一般的です。これは、確率に関連するデータのセットを探索するための適切なデフォルトの初期手順につながります。(ポアソン回帰など、より多くの試行に基づく確率がより確実に測定されているため、確率が「試行」の数に対する「成功」の観察比率に基づいている場合、より良い方法があります。これは、ここでは、確率は導き出された情報に基づいています。下の例の加重最小二乗法を使用してポアソン回帰アプローチを近似し、データの信頼性を高めることができます。)

例を見てみましょう。

図

R2Rlm

右側の散布図は、元々記録されていた確率でデータを表現しています。同じフィット感がプロットされています。今では対数オッズは、確率に変換される非線形方法に起因する湾曲見えます。

対数オッズに関する二乗平均平方根誤差の意味ではこの曲線が最適です。

なお、左側の雲、それは最小二乗最小二乗回帰モデルが妥当であることを示唆しているライン追跡方法の略楕円形状:データが適切に線形relation--によって記述することができる設け対数オッズありますused--また、線の周りの垂直方向の変動は、水平方向の位置に関係なく、ほぼ同じサイズです(等分散性)。(真ん中には異常に低い値がいくつかあり、詳細に調査する必要があります。)以下のコードに従ってコマンドplot(fit)を実行し、標準の診断を確認して、これをさらに詳しく評価します。これだけが、確率ではなくログオッズを使用してこれらのデータを分析する大きな理由です。


#
# Read the data from a table of (X,Y) = (X, probability) pairs.
#
x <- read.table("F:/temp/data.csv", sep=",", col.names=c("X", "Y"))
#
# Define functions to convert between probabilities `p` and log odds `z`.
# (When some probabilities actually equal 0 or 1, a tiny adjustment--given by a positive
# value of `e`--needs to be applied to avoid infinite log odds.)
#
logit <- function(p, e=0) {x <- (p-1/2)*(1-e) + 1/2; log(x) - log(1-x)}
logistic <- function(z, e=0) {y <- exp(z)/(1 + exp(z)); (y-1/2)/(1-e) + 1/2}
#
# Fit the log odds using least squares.
#
b <- coef(fit <- lm(logit(x$Y) ~ x$X))
#
# Plot the results in two ways.
#
par(mfrow=c(1,2))
plot(x$X, logit(x$Y), cex=0.5, col="Gray",
     main="Least Squares Fit", xlab="X", ylab="Log odds")
abline(b, col="Red", lwd=2)

plot(x$X, x$Y, cex=0.5, col="Gray",
     main="LS Fit Re-expressed", xlab="X", ylab="Probability")
curve(logistic(b[1] + b[2]*x), col="Red", lwd=2, add=TRUE)

回答ありがとうございます。試してみるには少し時間がかかります。
ティモシーヘンリー2014年

ログオッズを近似しようとすると、データを使用してコードを試行するときにエラーが発生します。「lm.fit(x、y、offset = offset、singular.ok = singular.ok、...)のエラー:NA / NaN / Inf in foreign function call(arg 4)」。
ティモシーヘンリー2014年

コード内のコメントを読んでください。それらは問題が何であり、それに対して何をすべきかを説明しています。
whuber

6

xxyy

plot(density(y));rug(y)xbetaregglm

私がロジスティック回帰によって何を意味しているかを理解するために:

# the 'real' relationship where y is interpreted as the probability of success
y = runif(400)
x = -2*(log(y/(1-y)) - 2) + rnorm(400,sd=2) 
glm.logit=glm(y~x,family=binomial); summary(glm.logit) 
plot(y ~ x); require(faraway); grid()
points(x,ilogit(coef(glm.logit) %*% rbind(1.0,x)),col="red")
tt=runif(400)  # an example of your untransformed regression
newy = ifelse(tt < y, 1, 0)
glm.logit=glm(newy~x,family=binomial); summary(glm.logit) 

# if there is not a good match in your tail probabilities try different link function or oversampling with correction (will be worse here, but perhaps not in your data)
glm.probit=glm(y~x,family=binomial(link=probit)); summary(glm.probit)
glm.cloglog=glm(y~x,family=binomial(link=cloglog)); summary(glm.cloglog)

真のモデルが$ log(\ frac {p} {1-p})= 2-0.5xであるロジスティック回帰

編集:コメントを読んだ後:

「y値は特定のクラスである確率であり、人が手動で行った分類の平均から得られる」ことを考えると、ベースデータでロジスティック回帰を行うことを強くお勧めします。次に例を示します。

y=1y=0x

require(faraway)
people = c("Jill","Jack")
proposer = sample(people,1000,replace=T)
incentive = runif(1000, min = 0, max =10)
noise = rnorm(1000,sd=2)
# base probability of agreeing is about 12% (ilogit(-2))
agrees = ilogit(-2 + 1*incentive + ifelse(proposer == "Jill", 0 , -0.75) + noise) 
tt = runif(1000)
observedAgrees = ifelse(tt < agrees,1,0)
glm.logit=glm(observedAgrees~incentive+proposer,family=binomial); summary(glm.logit) 

χn32χ22.dfχ22

xs = coef(glm.logit) %*% rbind(1,incentive,as.factor(proposer))
ys = as.vector(unlist(ilogit(xs)))
plot(ys~ incentive, type="n"); require(faraway); grid()
points(incentive[proposer == "Jill"],ys[proposer == "Jill"],col="red")
points(incentive[proposer == "Jack"],ys[proposer == "Jack"],col="blue")

ジル・イン・レッド・ジャック・イン・ブルー

ご覧のとおり、ジルはジャックよりもヒット率を上げるのが簡単ですが、インセンティブが上がるにつれてそれはなくなります。

基本的に、このタイプのモデルを元のデータに適用する必要があります。出力がバイナリの場合、多項式の場合は1/0を維持し、多項ロジスティック回帰が必要です。分散の追加のソースがデータコレクターではないと思われる場合は、データに意味があると思われるものであれば、別の因子(または連続変数)を追加します。データは最初、2番目、3番目に取得され、その後で初めてモデルが機能します。


OPのコメント「y値は特定のクラスである確率であり、人が手動で行った分類の平均から得られます」は、ロジスティック回帰がこれらのデータには不適切であることを示唆していますが、 「分類」とは何か、および「平均化」がどのように行われたかに応じて、生データ(最初の段落で提案したとおり)。質問に示されているデータに適用すると、質問に示されているglm線と非常によく似た、比較的平らな曲線のない線が生成されます。
whuber

ありがとうございました。そしてはい、yは確率です。:私はまた、関連する質問に生データを掲載stats.stackexchange.com/questions/83576/...私は、ログ(X)と呼ばれるものをxと呼ばれるが...他の質問では、
TimothéeHENRY

あなたの画像からサンプルを取得する前に、LOLであることを知っていればよかったのですが。
whuber

5

線形回帰モデルは、データにはあまり適していません。回帰から次のようなものが得られると期待できます。

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

x(7,4.5)


@pkofodはい、わかりました。そのため、コメントを削除しました(二乗されていることは知っていましたが、他の読者はそうではないかもしれません)。
Peter Flom

1
打ち切り回帰は、既知の固定範囲に限定された従属変数による回帰とは異なります。これらのデータは打ち切られておらず、打ち切り回帰は通常の回帰と何の違いもありません。
whuber

うん、悪いわ。その部分を削除しました。
pkofod 2014年

4

Yの境界は0と1であるため、通常の最小二乗回帰は適切ではありません。ベータ回帰を試すことができます。でRありbetareg、パッケージ。

このようなものを試してください

install.packages("betareg")
library(betareg)
betamod1 <- betareg(y~x, data = DATASETNAME)

より詳しい情報

編集:ベータ回帰、その利点と欠点の完全な説明が必要な場合は、より優れたレモン絞り器: SmithsonとVerkuilenによるベータ分布従属変数による最尤回帰を参照してください


4
betareg実際にどのモデルが実装されていますか?その仮定は何ですか?なぜこれらがこれらのデータに適用されると仮定することが合理的ですか?
whuber

2
@whuberいい質問ですね!モデルは、このビネットの 3ページと4ページで定義されています。これは、平均パラメーターと精度パラメーターの両方でパラメーター化されたベータ密度(両方ともモデル化でき、それぞれ独自のリンク関数を使用)と、二項モデル(および1つ以上)で使用されるものと同じリンク関数のセットに基づいています。それはMLによって適合され、GLMの適合と非常に似ています。
Glen_b-モニカの復活2014

2
@whuber条件付きベータモデルは、構成データおよびその他の連続型の比率または確率で一般的です。そのようなモデルの仮定がこれらのデータに適しているかどうかはわかりません(データが何であるかはわかりません。自分でモデルを提案する前の最初の懸念事項です)。でも、プロットからだけでも、彼らはここに他の推奨モデルと同様に適合します。回答には、ピーターの提案よりも正当化されていないように見えるいくつかのモデルがあり、正当化するのがより難しいと思われる(常に述べられているわけではない)仮定があるモデルもあります。
Glen_b-モニカを2014

1
ありがとう、@ Glen_b。私はピーターの提案に異議を唱えることはしません。それを理解しようとするだけです。私は以前にベータ回帰を使用したことがなく、将来の多くの読者が同じ状況になると想像しています。(私はこのスレッドで言及されている他のモデルに十分に精通しており、それらの仮定と考えられる欠点を理解しています!)したがって、この回答に少なくとも仮定の簡単な説明とこのソリューションを推奨する理由が含まれているとよいでしょう。
whuber

1
ああ、はい、ある時点で自分自身がその論文にリンクしました。Smithson(著者の1人)は彼のWebページにこの論文を掲載しています。補足資料はこちらにリンクされています
Glen_b-モニカを2014

1

最初に、線形モデルの機能を正確に知りたい場合があります。フォームの関係をモデル化しようとします

Yi=a+bXi+ϵi

ϵi

線形モデルが本当に探しているものである場合は、変数を少し変換して、OLSを実際に適合できるようにするか、別のモデルを完全に試すことができます。PCAまたはCCAを調べたい場合や、線形モデルの使用に本当にこだわっている場合は、最小二乗法の合計を試してください。両方向でエラーが発生する可能性があるため、より適切な「適合」が得られる可能性があります。


私はlmが線形関数(a + b * x + epsilon)の「合計最小二乗」最小値を探していると思った。迷っています。
ティモシーヘンリー2014年

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