R语言逻辑回归Logistic回归分析预测股票涨跌
最近我們被客戶要求撰寫關于邏輯回歸的研究報告,包括一些圖形和統計輸出。
視頻:R語言邏輯回歸(Logistic回歸)模型分類預測病人冠心病風險
邏輯回歸Logistic模型原理和R語言分類預測冠心病風險實例
,時長06:48
本文回答了關于邏輯回歸的問題:它與線性回歸有什么不同,如何在R中用glm()函數擬合和評估這些模型等等?
Logistic回歸是機器學習從統計學領域的一種技術。它是用一個或多個解釋變量對二項式結果進行建模的一種強大的統計方法。它通過使用邏輯函數估計概率來衡量分類因變量和一個或多個自變量之間的關系,這就是邏輯分布。
本R教程將指導你完成邏輯回歸的簡單執行。
- 你將首先探索邏輯回歸背后的理論:你將了解更多關于與線性回歸的區別以及邏輯回歸模型的樣子。你還會發現多指標和序數邏輯回歸。
- 接下來,你將解決R中的邏輯回歸問題:你不僅要探索一個數據集,還要使用R中強大的glm()函數擬合邏輯回歸模型,評估結果并解決過擬合問題。
提示:如果你有興趣將你的線性回歸技能提高到一個新的水平,也可以考慮參加我們的R語言課程!
?
回歸分析:簡介
邏輯回歸是一種回歸分析技術。回歸分析是一套統計過程,你可以用它來估計變量之間的關系。更具體地說,你用這套技術來模擬和分析一個因變量和一個或多個自變量之間的關系。回歸分析幫助你了解當一個自變量被調整而其他變量被固定時,因變量的典型值如何變化。
正如你已經讀到的,有各種回歸技術。你可以通過觀察三個方面來區分它們:自變量的數量、因變量的類型和回歸線的形狀。
線性回歸
線性回歸是最廣為人知的建模技術之一。簡而言之,它允許你使用線性關系來預測Y的(平均)數值,對于X的一個給定值,用一條直線。這條線被稱為 "回歸線"。
因此,線性回歸模型是y=ax+b。該模型假設因變量y是定量的。然而,在許多情況下,因變量是定性的,或者換句話說,是分類的。例如,性別是定性的,取值為男性或女性。
預測一個觀察值的定性反應可以被稱為對該觀察值進行分類,因為它涉及到將觀察值分配到一個類別或等級。另一方面,經常用于分類的方法首先預測定性變量的每個類別的概率,作為進行分類的基礎。
線性回歸不能夠預測概率。例如,如果你使用線性回歸為二元因變量建模,所產生的模型可能不會將預測的Y值限制在0和1之內。 這里就是邏輯回歸發揮作用的地方,你可以得到一個反映事件發生概率的概率分數。
Logistic邏輯回歸
邏輯回歸是分類技術的一個實例,你可以用它來預測一個定性的反應。更具體地說,邏輯回歸是對性別屬于某個特定類別的概率建模。
這意味著,如果你想做性別分類,其中反應性別屬于男性或女性這兩個類別中的一個,你將使用邏輯回歸模型來估計性別屬于某個特定類別的概率。
例如,給定長頭發的性別的概率可以寫成:。
Pr(gender=female|longhair)(縮寫為p(longhair))的值將在0和1之間。那么,對于任何給定的longhair值,可以對性別進行預測。
鑒于X是解釋變量,Y是因變量,那么你應該如何建立p(X)=Pr(Y=1|X)和X之間的關系模型?線性回歸模型表示這些概率為。
這種方法的問題是,任何時候對編碼為0或1的二元因變量進行直線擬合,原則上我們總是可以預測X的某些值的p(X)<0,其他值的p(X)>1。
為了避免這個問題,你可以使用logistic函數來建立p(X)的模型,對于X的所有值,它的輸出在0和1之間。
對數函數總是會產生一個S型曲線,所以無論X的值是多少,我們都會得到一個合理的預測。
上述方程也可以重構為:
數量
被稱為幾率比,可以在0和∞之間取任何值。接近0和∞的幾率值分別表示p(X)的概率非常低和非常高。
通過從上式中對兩邊取對數,你可以得到。
左手邊被稱為Logit。在一個邏輯回歸模型中,增加一個單位的X會使對數改變β0。但無論X的價值如何,如果β1是正的,那么增加X將與增加P(X)相關,如果β1是負的,那么增加X將與減少P(X)相關。
系數β0和β1是未知的,必須根據現有的訓練數據來估計。對于邏輯回歸,你可以使用最大似然,一種強大的統計技術。讓我們再來看看你的性別分類的例子。
你尋求β0和β1的估計值,將這些估計值插入p(X)的模型中,對于所有的女性樣本,產生一個接近于1的數字,對于所有的非女性樣本,產生一個接近于0的數字。
可以用一個叫做似然函數的數學方程來正式化。
選擇估計值β0和β1是為了使這個似然函數最大化。一旦系數被估計出來,你就可以簡單地計算出在任何長發的情況下是女性的概率。總的來說,最大似然法是擬合非線性模型的一個非常好的方法。
多項式Logistic回歸
到目前為止,本教程只關注了二項式邏輯回歸,因為你是將實例分類為男性或女性。多項式Logistic回歸模型是二項式Logistic回歸模型的一個簡單擴展,當探索性變量有兩個以上的名義(無序)類別時,你可以使用該模型。
在多項式邏輯回歸中,探索性變量被虛擬編碼為多個1/0變量。除了一個類別外,所有類別都有一個變量,所以如果有M個類別,就會有M-1M-1個虛擬變量。每個類別的虛擬變量在其類別中的值為1,在所有其他類別中的值為0。有一個類別,即參考類別,不需要它自己的虛擬變量,因為它是由所有其他變量都是0來唯一識別的。
然后,多叉邏輯回歸為每個虛擬變量估計一個單獨的二元邏輯回歸模型。結果是M-1M-1二元邏輯回歸模型。每個模型都傳達了預測因素對該類別成功概率的影響,與參考類別相比較。
有序logistic邏輯回歸
除了多叉邏輯回歸,你還有有序邏輯回歸,它是二叉邏輯回歸的另一個延伸。有序回歸是用來預測具有 "有序 "的多個類別和自變量的因變量。你已經在這種類型的邏輯回歸的名稱中看到了這一點,因為 "有序 "意味著 "類別的順序"。
換句話說,它被用來分析因變量(有多個有序層次)與一個或多個自變量的關系。
例如,你正在進行客戶訪談,評估他們對我們新發布產品的滿意度。你的任務是向受訪者提出一個問題,他們的答案介于滿意-滿意或不滿意-非常不滿意之間。為了很好地概括答案,你在回答中加入了一些等級,如非常不滿意,不滿意,中立,滿意,非常滿意。這有助于你觀察類別中的自然秩序。
用glm進行R語言的Logistic回歸
在本節中,你將研究一個二元邏輯回歸的例子,你將用ISLR包解決這個問題,它將為你提供數據集,glm()函數一般用于擬合廣義線性模型,將用于擬合邏輯回歸模型。
加載數據
首先要做的是安裝和加載ISLR包,它有你要使用的所有數據集。
在本教程中,你將使用股市數據集。該數據集顯示了2001年至2005年間標準普爾500股票指數的每日收益率。
探索數據
讓我們來探索一下。names()對于查看數據框上的內容很有用,head()是對前幾行的一瞥,而summary()也很有用。
?
summary()函數為你提供了數據框架上每個變量的簡單總結。你可以看到有成交量,收盤價,和漲跌方向。你將使用 "漲跌方向 "作為因變量,因為它顯示了自前一天以來市場是上漲還是下跌。
數據的可視化
數據可視化也許是總結和了解你的數據的最快和最有用的方法。你將從單獨探索數字變量開始。
直方圖提供了一個數字變量的柱狀圖,它被分成若干個部分,其高度顯示了屬于每個部分的實例的數量。它們對于獲得一個屬性的分布特征是很有用的。
for(i in 1:8)hist(Smarket[,i]這是極難看到的,但大多數變量顯示出高斯或雙高斯的分布。
你可以用盒狀圖和盒須圖以不同的方式來觀察數據的分布。盒子包括了數據的中間50%,線顯示了中位數,圖中的須線顯示了數據的合理范圍。任何在須線之外的點都是離群值。
for(i in 1:8) boxplot(Smarket[,i]你可以看到,Lags和Today都有一個類似的范圍。除此之外,沒有任何離群值的跡象。
缺失數據對建模有很大影響。因此,你可以使用缺失圖來快速了解數據集中的缺失數據量。X軸顯示屬性,Y軸顯示實例。水平線表示一個實例的缺失數據,垂直塊表示一個屬性的缺失數據。
mis( col=c("blue", "red")在這個數據集中沒有缺失數據!
讓我們開始計算每一對數字變量之間的相關性。這些成對的相關關系可以繪制在相關矩陣圖中,了解哪些變量在一起變化。
corrplot(correlations, method="circle")使用點表示法,藍色代表正相關,紅色代表負相關。點越大,相關度越大。你可以看到矩陣是對稱的,對角線是完全正相關的,因為它顯示了每個變量與自身的相關性。但是,沒有一個變量是相互關聯的。
我們來做一個數據圖。有一個pair()函數可以將Smarket中的變量繪制成一個散點圖矩陣。在這種情況下,"漲跌方向",你的二元因變量,是顏色指標。
看起來這里沒有什么關聯性。該類變量來自于變量今日收益,所以漲和跌做了劃分。
讓我們來看看按方向值細分的每個變量的密度分布。像上面的散點圖矩陣一樣,按方向繪制的密度圖可以幫助看到漲和跌的方向。它還可以幫助了解一個變量的方向的重疊情況。
Plot(x=x, y=y, plot="density", scales=scales)你可以看到,所有這些變量的方向值都是重疊的,這意味著僅憑一兩個變量很難預測上漲或下跌。
建立Logistic回歸模型
現在你調用glm.fit()函數。你傳遞給這個函數的第一個參數是一個R公式。在這種情況下,該公式表明方向是因變量,而滯后和成交量變量是預測因素。正如你在介紹中看到的,glm通常用于擬合廣義線性模型。
然而,在這種情況下,你需要明確表示你想擬合一個邏輯回歸模型。你通過將族參數設置為二項式來解決這個問題。這樣,你就告訴glm()把擬合一個邏輯回歸模型,而不是可以擬合glm的許多其他模型中的一個。
接下來,你可以做一個summary(),它告訴你一些關于擬合的信息。
正如你所看到的,summary()返回每個系數的估計值、標準誤差、z-score和p值。看上去沒有一個系數是顯著的。它還給出了無效偏差(僅指平均值的偏差)和殘差偏差(包含所有預測因素的模型的偏差)。兩者之間的差異非常小,而且有6個自由度。
你把glm.fit()的預測結果分配給glm.probs,類型等于因變量。這將對你用來擬合模型的訓練數據進行預測,并給我一個擬合概率的向量。
你看一下前5個概率,它們非常接近50%。
probs[1:5]現在我將根據滯后期和其他預測因素對市場是上漲還是下跌做出預測。特別是,我將通過0.5的閾值將概率變成分類。為了做到這一點,我使用ifelse()命令。
ifelse(probs > 0.5, "Up", "Down")glm.pred是一個真和假的向量。如果glm.probs大于0.5,glm.pred調用 "Up";否則,調用 "False"。
在這里,你附上數據框架Smarket,并制作一個glm.pred的表格,這是上一個方向的上漲和下跌。你還可以取其中的平均值。
從表中看,對角線上的實例是你獲得正確分類的地方,而對角線外的實例是你分類錯誤的地方。看起來你犯了很多錯誤。平均值給出的比例是0.52。
創建訓練樣本和測試樣本
你怎么能做得更好呢?把數據分成訓練集和測試集是一個好的策略。
# 生成訓練和測試集 train = Year<2005 predict(glm.fit,newdata = Smarket[!train,],type = "response")讓我們詳細看看這個代碼塊。
- train等于比2005年少的那一年。對于所有小于2005年的年份,你會得到一個true;否則,我會得到一個false。
- 然后你用glm.fit()重新擬合模型,只是子集等于'train',這意味著它只擬合小于2005年的數據。
- 然后你再次對glm.probs使用predict()函數來預測大于或等于2005年的剩余數據。對于新的數據,你給了它Smarket,用!"train "作為索引(如果年份大于或等于2005,train為真)。你將類型設置為 "因變量 "以預測概率。
- 最后,你對glm.pred再次使用ifelse()函數來生成上漲和下跌變量。
你現在做一個新的變量來存儲測試數據的新子集,并把它叫做Direction.2005。因變量仍然是方向。你制作一個表格并計算這個新測試集的平均值。
Direction.2005 = Direction[!train]比以前的情況還糟糕。怎么會出現這種情況?
解決過度擬合的問題
好吧,你可能對數據進行了過度擬合。為了解決這個問題,你要擬合一個較小的模型,使用Lag1、Lag2、Lag3作為預測因子,從而撇開所有其他變量。代碼的其余部分是一樣的。
#擬合一個較小的模型 glm(family = binomial, subset = train)好吧,你得到了59%的分類率,不算太差。使用較小的模型似乎表現得更好。
最后,你對glm.fit做一個summary(),看看是否有任何明顯的變化。
沒有什么變得很重要,至少P值更好了,表明對性能的預測有所提高。
結語
所以,這個關于使用glm()函數和設置族為二項式建立邏輯回歸模型的R教程就結束了。glm()并不假設因變量和自變量之間的線性關系。然而,它假定logit模型中的鏈接函數和自變量之間存在線性關系,我希望你能學到有價值的東西。
總結
以上是生活随笔為你收集整理的R语言逻辑回归Logistic回归分析预测股票涨跌的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php plaintext,php从邮件
- 下一篇: 接口测试与Postman