[PYTHON] [Statistik] [R] Versuchen Sie, die Teilungspunktregression zu verwenden.

Dies ist eine Einführung in eine Methode namens Divisionspunktregression.

Eine normale Regressionslinie kann als bedingte Erwartung (Mittelwert) von $ y $ bei $ x $ interpretiert werden, bei einer Bruchpunktregression jedoch als 25% oder 95% Bruchpunkt. Zeichnen wir eine Regressionslinie basierend auf dem in usw. verwendeten "Teilungspunkt" usw.

Wie auch immer, zuerst werde ich ein Diagramm damit zeichnen und versuchen, es zu visualisieren.

1. Beispiel einer Normalverteilung, bei der die Varianz des Fehlers von den erklärenden Variablen abhängt

In diesem Fall ist die Fehlervarianz klein, wenn die erklärende Variable $ x $ klein ist, und die Fehlervarianz ist groß, wenn die erklärende Variable $ x $ groß ist. Ich versuche solche Daten zu generieren.

Bei der Teilungspunktregression werden für jeden Teilungspunkt unterschiedliche $ \ beta $ festgelegt, sodass jeder eine andere Steigung aufweist.

** Ausführungsergebnis der Teilungspunktregression ** Von unten 5%, 10%, 25%, 75%, 90%, 95% Teilungspunkt-Regressionslinie und normale Regressionslinie. Quantile_Reg_line-compressor.png

Generieren Sie zunächst Daten und zeichnen Sie ein Streudiagramm.

#Wenn nicht installiert, installieren Sie es.
#install.packages('quantreg')
library(quantreg)

b <- -5   #Gerade Neigung
a <- 35   #Gerader Abschnitt

data_x <- runif(500, 0, 5)    # 0-Einheitliche Zufallszahl zwischen 5
data_y <- rep(0, length(data_x))
for (i in 1:length(data_x)){
    #Sektion:a,Neigung:Ein Modell mit einem Fehler in der geraden Linie von b
    data_y[i] <- b*data_x[i] + a + rnorm(1, mean=0, sd=1+ data_x[i])  #Stellen Sie die Verteilung abhängig von der Größe der erklärenden Variablen ein
}

#Zeichnen Sie ein Streudiagramm
plot(data_x, data_y, xlab="Random Variable", ylab="Random Variable", 
        type = "n", cex=.5, xlim=c(0, 5), ylim=c(0, 40))
points(data_x, data_y, cex=.5, col="blue")

Für diese generierten Daten wurde eine Teilungspunktregression bei 5%, 10%, 25%, 75%, 90% bzw. 95% durchgeführt und eine gerade Linie gezogen. Gleichzeitig wird auch das Ergebnis einer normalen linearen Regression gezeichnet und verglichen. In diesem Beispiel wird eine Normalverteilung für die Fehlerverteilung verwendet, und da sie bilateral symmetrisch ist, sind das Ergebnis der Regressionslinie des zentralen Werteteilungspunkts und der normalen linearen Regression, die den Mittelwert darstellen, nahezu gleich.

taus <- c(.05, ,.95, .10, .90, .25, .75)    #Stellen Sie den Teilungspunkt ein
cols <- c(4, 3, 2, 2, 3, 4)                 #Färben Sie die geraden Linien separat
xx <- seq(min(data_x), max(data_x), .1)
f  <- coef(rq( (data_y) ~ (data_x), tau=taus) )    #Ausführung der Divisionspunktregressionsberechnung
yy <- cbind(1,xx) %*% f

#Zeichnung der Teilungspunkt-Regressionslinie
for(i in 1:length(taus)){
    lines(xx, yy[,i], col=cols[i]))
}
abline(lm(data_y ~ data_x), col="red", lty = 2, lw=2)    #Zeichnen Sie eine normale Regressionslinie
abline(rq(data_y ~ data_x), col="black", lw=2)           #Median(median)Zeichnen Sie eine Teilungspunkt-Regressionslinie von

legend(0, 8, c("mean (LSE) fit", "median (LAE) fit"), col = c("red","black"),lty = c(2, 1), lw=c(1, 2))

2. Beispiel für die exponentielle Verteilung von Fehlern

Im Fall einer bilateral symmetrischen Verteilung ist dies weniger interessant. Versuchen Sie daher, Daten mithilfe einer Exponentialverteilung mit einem langen Schwanz nach rechts zu generieren, und wenden Sie die Teilungspunktregression an.

Dann wird eine gerade Linie an einer Position gezeichnet, an der die Teilungspunktregression des Medianwerts, die durch die schwarze gerade Linie geteilt wird, plausibler ist als die gerade Linie der Methode der kleinsten Quadrate, die durch die rot gepunktete Linie dargestellt wird. Aufgrund der langen Saumverteilung sind die unteren Bereiche dicht und die oberen Bereiche weiter entfernt.

Quantile_Reg_exp-compressor.png

Generieren Sie Daten mit exponentieller Fehlerverteilung und zeichnen Sie ein Streudiagramm.

#Wenn nicht installiert, installieren Sie es.
#install.packages('quantreg')
library(quantreg)

# b      :Gerade Neigung
# lambda :Exponentialverteilungsparameter
# taus   :Liste ex definierter Teilungspunkte: c(.05, .95, .10, .90, .25,.75) 
quant_reg_exp <- function(b, lambda, taus){
    Dat   <- NULL
    Dat$x <- rnorm(100, mean=50, sd=7)   #Erklärende Variablen sind durchschnittlich:50,Standardabweichung:Erzeugt mit einer Normalverteilung von 7
    Dat$y <- rep(0, 100)

    for (i in 1:length(Dat$x)){
        Dat$y[i] <- b * Dat$x[i] + rexp(1, lambda)    #Fehler gemäß Exponentialverteilung erzeugen
    }
    data_x = Dat$x
    data_y = Dat$y
    
    #Zeichnen Sie ein Streudiagramm
    plot(data_x, data_y ,xlab="Random Variable", ylab="Random Variable", type="n", cex=.5) 
    points(data_x, data_y ,cex=.5, col="blue")

    xx <- seq(min(data_x), max(data_x), .1)
    f  <- coef(rq((data_y)~(data_x), tau=taus))     #Ausführung der Divisionspunktregressionsberechnung
    yy <- cbind(1,xx)%*%f

    #Zeichnen Sie eine gerade Linie
    cols <- c(2, 2, 3, 3, 4, 4)
    for(i in 1:length(taus)){
        lines(xx, yy[,i], col=cols[i]) 
    }
    abline(lm(data_y ~ data_x), col="red", lty=2)    #Zeichnen Sie eine normale Regressionslinie
    abline(rq(data_y ~ data_x), col="black", lw=2)   #Median(median)Zeichnen Sie eine Teilungspunkt-Regressionslinie von
    legend(min(data_x), max(data_y), c("mean (LSE) fit", "median (LAE) fit"), 
                 col=c("red","black"), lty=c(2,1), lw=c(1,2))
}

# param: b, lambda, taus
quant_reg_exp(.5, .5, c(.05, .95, .10, .90, .25,.75))

3. Berühren Sie einfach die theoretische Sache

Es ist nur eine Berührung, aber ich möchte die Punkte beschreiben, die sich von der Methode der minimalen Quadrate unterscheiden. Einzelheiten finden Sie in den unten aufgeführten Referenzen.

Die blaue Linie unten ist eine Zeichnung der Funktion $ 1/2 x ^ 2 $ und stellt die Funktion dar, die den Fehler bewertet, der bei der Methode der kleinsten Quadrate verwendet wird.

Die rote Linie zeichnet eine asymmetrische Absolutwertfunktion gemäß $ \ tau $, die als Funktion zur Bewertung des Fehlers der Teilungspunktregression verwendet wird. Die Fehlerauswertungsfunktion ändert sich entsprechend dem Teilungspunkt $ \ tau $.

Beides sind Funktionen zur Auswertung des Abstandes von 0 ab 0. Der Hauptpunkt besteht darin, den Abstand in negativer Richtung in positive Richtung zu ändern. Indem dies asymmetrisch gemacht wird, versucht die Teilungspunktregression, den angegebenen Teilungspunkt $ \ tau $ darzustellen, anstatt sich auf die Mitte zu verlassen.

err_func_quantile_reg-compressor.gif (Der Zeichnungscode lautet hier. Dies ist in Python geschrieben ...)

Die Teilungspunkt-Regressionslinie $ \ hat {g_ {\ tau}} $ am Teilungspunkt $ \ tau $ kann wie folgt definiert werden. Das Problem besteht darin, $ g (\ cdot) $ zu finden, das den von der Funktion $ \ psi_ {\ tau} (\ cdot) $ bewerteten Fehler minimiert.

\hat{g_{\tau}} = \arg\min_{g \in \mathcal{G}} \sum_{i=1}^{n} \psi_{\tau} \{ y_i - g(x_i) \} 

Zu diesem Zeitpunkt ist im Fall der Methode der kleinsten Quadrate die Funktion $ \ psi (\ cdot) $ (blaue Linie)

\psi_{\tau}(r) = {1 \over 2} r^2

Bei der Teilungspunktregression wird jedoch die folgende asymmetrische Absolutwertfunktion (rote Linie) verwendet, um den Fehler zu bewerten.

\psi_{\tau}(r) = 
\begin{cases}
    (\tau − 1)\ r & {\rm if}\ \ r \le 0\\
    \tau r & {\rm if}\ \ 0 < r
 \end{cases}

Nehmen wir nun eine lineare Funktion für $ g (\ cdot) $ an,

g(x_i) = \alpha + \beta x_i

Daher besteht das Problem darin, $ \ alpha, \ beta $ zu finden, das den Wert der Fehlerfunktion in der obigen Gleichung minimiert.

Der geschätzte Betrag von $ y $ sei $ \ hat {y} = g (x_i) $.

Außerdem sei die Fehlerdichtefunktion und die kumulative Dichtefunktion $ f (y), \ F (y) $. Das Bild unten ist abgebildet.

gamma_plot2-compressor.png

gamma_pdf_cdf-compressor.png

Die Fehlerfunktion $ L () $ ist unten definiert.

L(\hat{y}) = E[\psi_{\tau} \{ y_i - \hat{y} \} ] 
= (\tau -1) \int_{-\infty}^{\hat{y}} (y-\hat{y})\ f(y) \ dy 
+ \tau \int^{\infty}_{\hat{y}} (y-\hat{y})\ f(y)\ dy

Wenn die Fehlerfunktion $ L (\ cdot) $ durch $ \ hat {y} $ differenziert und auf 0 gesetzt wird,

{\partial L \over \partial \hat{y}} = 
(\tau -1) \int_{-\infty}^{\hat{y}} (-1)\ f(y) \ dy 
+ \tau \int^{\infty}_{\hat{y}} (-1)\ f(y) \ dy       \\
= \int_{-\infty}^{\hat{y}}\ f(y) \ dy - \tau\  \left( \int_{-\infty}^{\hat{y}}\ f(y) \ dy + \int^{\infty}_{\hat{y}}\ f(y) \ dy \right)   \\
= F(\hat{y}) - \tau = 0

Deshalb,

F(\hat{y}) = \tau 

[1] ‘quantreg’ manual   https://cran.r-project.org/web/packages/quantreg/quantreg.pdf

[2] Wikipedia "Quantile Regression"   https://en.wikipedia.org/wiki/Quantile_regression

http://miuse.mie-u.ac.jp/bitstream/10076/10813/1/M2008288.pdf

http://www.okui.kier.kyoto-u.ac.jp/doc/quantile.pdf

http://reposit.sun.ac.jp/dspace/bitstream/10561/746/1/v43n4p87_nakamura.pdf

Recommended Posts

[Statistik] [R] Versuchen Sie, die Teilungspunktregression zu verwenden.
Versuchen Sie, Statistiken mit e-Stat abzurufen
Versuchen Sie es mit Tkinter
Versuchen Sie es mit Docker-Py
Versuchen Sie es mit einem Ausstecher
Versuchen Sie es mit PDFMiner
Versuchen Sie es mit Geopandas
Versuchen Sie es mit Selen
Versuchen Sie es mit scipy
Versuchen Sie es mit pandas.DataFrame
Versuchen Sie es mit Django-Swiftbrowser
Versuchen Sie es mit matplotlib
Versuchen Sie es mit tf.metrics
Versuchen Sie es mit PyODE
Versuchen Sie es mit einer objektorientierten Klasse in R (R6-Methode)
Rückkehr nach dem Gaußschen Verfahren
Versuchen Sie es mit virtualenv (virtualenvwrapper)
[Azure] Versuchen Sie, Azure-Funktionen zu verwenden
Versuchen Sie es jetzt mit virtualenv
Versuchen Sie es mit W & B.
Versuchen Sie es mit Django templates.html
[Kaggle] Versuchen Sie es mit LGBM
Versuchen Sie es mit dem Feed-Parser von Python.
Versuchen Sie es mit Pythons Tkinter
Versuchen Sie eine Regression mit TensorFlow
Versuchen Sie es mit Tweepy [Python2.7]
Versuchen Sie es mit Pytorchs collate_fn
Versuchen Sie, eine lineare Regression mit Pytorch mit Google Colaboratory zu implementieren
Gaußsche Prozessregression mit GPy
Versuchen Sie, PythonTex mit Texpad zu verwenden.
[Python] Versuchen Sie, Tkinters Leinwand zu verwenden
Versuchen Sie es mit Jupyters Docker-Image
Versuchen Sie es mit Scikit-Learn (1) - K-Clustering nach Durchschnittsmethode
Versuchen Sie die Funktionsoptimierung mit Hyperopt
Versuchen Sie es mit matplotlib mit PyCharm
Versuchen Sie es mit Azure Logic Apps
Versuchen Sie es mit Kubernetes Client -Python-
[Kaggle] Versuchen Sie es mit xg boost
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit OpenCV unter Windows
Versuchen Sie, Jupyter Notebook dynamisch zu verwenden
Versuchen Sie es mit AWS SageMaker Studio
Versuchen Sie, automatisch mit Selen zu twittern.
Versuchen Sie es mit SQLAlchemy + MySQL (Teil 1)
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit SQLAlchemy + MySQL (Teil 2)
Versuchen Sie es mit der Vorlagenfunktion von Django
Lineare Regressionsmethode mit Numpy
Versuchen Sie es mit der PeeringDB 2.0-API
Versuchen Sie es mit der Entwurfsfunktion von Pelican
Versuchen Sie es mit pytest-Overview und Samples-
Versuchen Sie es mit Folium mit Anakonda