分位回帰を線形計画問題として定式化しますか?


8

分位点回帰を線形計画問題として定式化するにはどうすればよいですか?変位値の中央値の問題を見ると、

minimize ∑i=1n|β0+Xiβ1−Yi|transforms into minimize ∑i=1neis.t.ei≥β0+Xiβ1−Yiei≥−(β0+Xiβ1−Yi)
が、他の変位値の最小化をどのように変換しますか?


いくつかの関連するRコードはここにあります。
— kjetil b halvorsen 2018

回答:


14

変位値回帰推定量を使用する

β^(τ):=arg⁡minθ∈RK∑i=1Nρτ(yi−xi⊤θ).

ここで、τ∈(0,1)は、推定する必要があるρτ(.)値に従って選択される定数であり、関数\ rho_ \ tau(。)は次のように定義されます

ρτ(r)=r(τ−I(r<0)).

の目的を確認するために、これらがとして定義されている場合、引数として残差を取ることを最初に考慮してください。したがって、最小化問題の合計は、次のように書き直すことができます。ρτ(.)ϵi=yi−xi⊤θ

∑i=1Nρτ(ϵi)=∑i=1Nτ|ϵi|I[ϵi≥0]+(1−τ)|ϵi|I[ϵi<0]

提案された分位点回帰直線より上の観測関連する正の残差にはの重みが与えられ、提案された分位回帰直線より下の観測関連する負の残差重み付けされます。yixi⊤θτyixi⊤θ(1−τ)

直感的に:

正および負の残差は、同じ重さと観察の同数と「罰」されているラインに最適の「ライン」の上および下にある中央値の回帰であります"ライン"。τ=0.5xi⊤β^

場合、各正の残差は、重み負の残差の9倍に重み付けされるため、 "line"を超えるすべての観測に対して最適です約9ラインの下に配置されます。したがって、「線」は0.9分位数を表します。(これの正確なステートメントについては、THM 2.2およびKoenker(2005)の「コロラリ2.1」「Quantile Regression」を参照してください)τ=0.91−τ=0.1xi⊤β^

2つのケースがこれらのプロットに示されています。左パネルおよび右パネル。τ=0.5τ=0.9

rho-function tau = 0.5およびtau = 0.9

線形プログラムは主に標準形式を使用して分析および解決されます

(1)  minz  c⊤z  subject to Az=b,z≥0

標準形式の線形プログラムに到達するための最初の問題は、そのようなプログラム(1)では、最小化が実行されるすべての変数が正であることです。この残差を達成するには、スラック変数を使用して正と負の部分に分解します。z

ϵi=ui−vi

ここで、正の部分およびは負の部分です。チェック関数によって重みが割り当てられた残差の合計は、次のようになります。ui=max(0,ϵi)=|ϵi|I[ϵi≥0]vi=max(0,−ϵi)=|ϵi|I[ϵi<0]

∑i=1Nρτ(ϵi)=∑i=1Nτui+(1−τ)vi=τ1N⊤u+(1−τ)1N⊤v,

ここで、およびおよび はベクトルすべての座標は等しい。u=(u1,...,uN)⊤v=(v1,...,vN)⊤1NN×11

残差は、次の制約を満たさなければなりません。N

yi−xi⊤θ=ϵi=ui−vi

これは、線形プログラムとしての定式化をもたらします

minθ∈RK,u∈R+N,v∈R+N{τ1N⊤u+(1−τ)1N⊤v|yi=xiθ+ui−vi,i=1,...,N},

Koenker(2005)の「Quantile Regression」の10ページの式(1.20)に記載されています。

ただし、は、標準形式(1)の線形計画で必要とされる正の値に制限されていないことに注目してください。したがって、再び正と負の部分への分解が使用されますθ∈R

θ=θ+−θ−

ここでもは正の部分であり、は負の部分です。制約は次のように書くことができますθ+=max(0,θ)θ−=max(0,−θ)N

y:=[y1⋮yN]=[バツ1⊤⋮バツN⊤](θ+−θ−)+私Nあなた−私Nv、

ここで、です。私N=d私ag{1N}

次に、と次のように独立変数のデータを格納する計画行列を定義します。b:=yバツ

バツ:=[バツ1⊤⋮バツN⊤]

制約を書き換えるには:

b=バツ(θ+−θ−)+私Nあなた−私Nv=[バツ、−バツ、私N、−私N][θ+θ−あなたv]

行列を定義する(N×2K+2N)

あ:=[バツ、−バツ、私N、−私N]
そしてとを最小化する変数として導入し、それらを最小化して一部として取得します。θ+θ−z

b=あ[θ+θ−あなたv]=あz

なぜならおよびのみを介して最小化問題に影響を与える制約A寸法の coeffientベクターの一部として導入されなければならない適宜ように定義することができます。θ+θ−02K×1c

c=[0τ1N(1−τ)1N]、

したがって、c⊤z=0⊤(θ+−θ−)⏟=0+τ1N⊤あなた+(1−τ)1N⊤v=Σ私=1Nρτ(ε私)。

したがって、、が定義され、指定されたプログラムが完全に指定されます。c、あb(1)

これはおそらく、例を使用して消化するのが最善です。これをRで解決するには、Roger Koenkerによるquantregパッケージを使用してください。以下は、線形プログラムを設定し、線形プログラムのソルバーで解く方法の図でもあります。

base=read.table("http://freakonometrics.free.fr/rent98_00.txt",header=TRUE)
attach(base)
library(quantreg)
library(lpSolve)
tau <- 0.3


# Problem (1) only one covariate
X <- cbind(1,base$area)
K <- ncol(X)
N <- nrow(X)

A <- cbind(X,-X,diag(N),-diag(N))
c <- c(rep(0,2*ncol(X)),tau*rep(1,N),(1-tau)*rep(1,N))
b <- base$rent_euro
const_type <- rep("=",N)

linprog <- lp("min",c,A,const_type,b)
beta <- linprog$sol[1:K] -  linprog$sol[(1:K+K)]
beta
rq(rent_euro~area, tau=tau, data=base)


# Problem (2) with 2 covariates
X <- cbind(1,base$area,base$yearc)
K <- ncol(X)
N <- nrow(X)

A <- cbind(X,-X,diag(N),-diag(N))
c <- c(rep(0,2*ncol(X)),tau*rep(1,N),(1-tau)*rep(1,N))
b <- base$rent_euro
const_type <- rep("=",N)

linprog <- lp("min",c,A,const_type,b)
beta <- linprog$sol[1:K] -  linprog$sol[(1:K+K)]
beta
rq(rent_euro~ area + yearc, tau=tau, data=base)

その最小化を言葉で説明してもらえませんか...私はそれを完全に理解できません
— machazthegamer

私は忍耐を持って展開します、編集は来ています:)
— ジェスパー大統領のために

詳細が必要な場合は、今すぐフォローアップの質問をしてください。
— ジェスパー大統領、

4

私はcvxoptを使用してPythonでJesper Hybelのコードを書き直しました。他の誰かがPythonでもこれを必要とする場合に備えて、ここに投稿します。

import pandas as pd
import io
import requests
import numpy as np
url="http://freakonometrics.free.fr/rent98_00.txt"
s=requests.get(url).content
base=pd.read_csv(io.StringIO(s.decode('utf-8')), sep='\t')


tau = 0.3

from cvxopt import matrix, solvers

X = pd.DataFrame(columns=[0,1])
X[1] = base["area"] #data points for independent variable area
X[2] = base["yearc"] #data points for independent variable year
X[0] = 1 #intercept

K = X.shape[1]
N = X.shape[0]

# equality constraints - left hand side

A1 = X.to_numpy() # intercepts & data points - positive weights
A2 = X.to_numpy() * - 1 # intercept & data points - negative weights
A3 = np.identity(N) # error - positive
A4 = np.identity(N)*-1 # error - negative

A = np.concatenate((A1,A2,A3,A4 ), axis= 1) #all the equality constraints 

# equality constraints - right hand side
b = base["rent_euro"].to_numpy()

#goal function - intercept & data points have 0 weights
#positive error has tau weight, negative error has 1-tau weight
c = np.concatenate((np.repeat(0,2*K), tau*np.repeat(1,N), (1-tau)*np.repeat(1,N) ))

#converting from numpy types to cvxopt matrix

Am = matrix(A)
bm = matrix(b)
cm = matrix(c)

# all variables must be greater than zero
# adding inequality constraints - left hand side
n = Am.size[1]
G = matrix(0.0, (n,n))
G[::n+1] = -1.0

# adding inequality constraints - right hand side (all zeros)
h = matrix(0.0, (n,1))

#solving the model
sol = solvers.lp(cm,G,h,Am,bm, solver='glpk')

x = sol['x']

#both negative and positive components get values above zero, this gets fixed here
beta = x[0:K] - x[K :2*K]

print(beta)
```

ありがとう、あなたのPythonへの翻訳は私を大いに助けてくれました。 Gそしてh、元のRコードまたはジェスパーの過去記事には表示されません。これらのアーティファクトは、CVXOPTが問題の定式化を必要とする方法に関するものですか、それともLPソルバーで暗黙的なものですか?私の場合、N = 50,000で実行しようとする障害に遭遇しました。Gこの場合、巨大な正方行列になります。Sparkのような分散LPソルバーを使用することを検討していますが、LPをこのデータスケールでの分位点回帰に使用するのは扱いにくいだけかもしれません。
— peace_within_reach

以前のコメントの補足:quantreg rqルーチンを1,500万行のデータで実行できました。線形計画法に基づいた方法ならどれだけのデータを処理できるかに感銘を受けました。ただし、私の場合(非常に高い変位値を見積もる)、それよりもさらに多くのデータを使用する必要があります。rq2,000万行以上を使用すると、チョークが見つかりました。エラーはですlong vectors are not supported in .C。これは、ベクトルが長くなりすぎるためです。同じ状況にいる誰にとっても、ビッグデータの分位回帰のために私が見つけた最高のソフトウェアは、MicrosoftのLightGBM(勾配ブースト)です
— peace_within_reach

1
はい、GとhはCVXOPT公式化のみです。CVXOPTのドキュメントを読んでいる場合にも、それらが見つかります。CVXOPTのアプローチでは、等式制約は1つの行列(A)に格納され、不等式制約は別の行列(G)に格納されます。同じことが右側の行列(h)にも言えます。
— メイトうづき

2
パフォーマンスが必要な場合は、solver = 'glpk'を使用することが重要です。速度が大幅に変化します。他のソルバーを試して、より速い結果が得られるかどうかを確認することもお勧めします。
— Mate Uzsoki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.