iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
1
AI & Data

連接數學與現實世界的橋樑 -- 數學建模系列 第 29

Day 29 : 隨機過程 -- 時間序列

今天要介紹的是時間序列,它是一個隨時間變化的隨機過程,通常是在固定的時間區間上進行分析,例如每天的溫度和降雨量,每月的失業率以及年收入都是時間序列的一種,而分析時間序列資料的工具之一就是線性回歸。讓我們用昨天的例子以時間序列的方式再分析一次,看看有甚麼相異之處。

範例

對1986年6月到1989年6月的CM1指數的資料來估計1990年5月的CM1指數

  1. 提出問題
    預測https://chart.googleapis.com/chart?cht=tx&chl=E(X_48)
  2. 選擇建模方法
    使用時間序列模擬這個問題,並擬合一個自回歸模型,它假設在一個穩定的時間序列中加入一個趨勢,這趨勢是隨時間變化的非隨機函數。若https://chart.googleapis.com/chart?cht=tx&chl=E(X_t)和自相關係數https://chart.googleapis.com/chart?cht=tx&chl=%5Crho%20(x%2C%20t)在時間上是常數,則該時間序列被稱為是穩定的。
    自相關係數,https://chart.googleapis.com/chart?cht=tx&chl=%5Crho%20(X_1%2C%20X_2)%20%3D%20corr(X_1%2C%20X_2)%20%3D%20%5Cfrac%7BCov(X_1%2C%20X_2)%7D%7B%5Csigma_1%20%5Csigma_2%7D%20,其中https://chart.googleapis.com/chart?cht=tx&chl=Cov(X_1%2C%20X_2)%20%3D%20E%5B(X_1%20-%20%5Cmu_1)(X_2%20-%20%5Cmu_2)%5D
    因此,在此例中https://chart.googleapis.com/chart?cht=tx&chl=%5Crho%20(t%2C%20h)%20%3D%20corr(X_t%2C%20X_%7Bt%2Bh%7D)
    我們使用最簡單有用的模型自回歸過程
    https://chart.googleapis.com/chart?cht=tx&chl=X_t%20%3D%20a%20%2B%20bt%20%2B%20c_1%20X_%7Bt-1%7D%20%2B%20%5Cdots%20%2B%20c_p%20X_%7Bt-p%7D%20%2B%20%5Cvarepsilon_t
    來模擬此模型,參數https://chart.googleapis.com/chart?cht=tx&chl=p稱為自回歸過程的。在這邊就會產生一個問題,如何選取合的https://chart.googleapis.com/chart?cht=tx&chl=phttps://chart.googleapis.com/chart?cht=tx&chl=%5CRightarrow 關注https://chart.googleapis.com/chart?cht=tx&chl=R%5E2的值,作法是將預測變項https://chart.googleapis.com/chart?cht=tx&chl=X_%7Bt-1%7D%2C%20X_%7Bt-2%7D%2C%20%5Cdots一個一個加入,直到https://chart.googleapis.com/chart?cht=tx&chl=R%5E2的改善達到最小為止。
  3. 推導模型的數學表達式
    考慮https://chart.googleapis.com/chart?cht=tx&chl=X_t%20%3D%20a%20%2B%20bt%20%2B%20c_1%20X_%7Bt-1%7D%20%2B%20%5Cdots%20%2B%20c_p%20X_%7Bt-p%7D%20%2B%20%5Cvarepsilon_t對某些常數https://chart.googleapis.com/chart?cht=tx&chl=a%2C%20b%2C%20c_1%20%2C%20c_2%20%2C%20%5Cdots%20%2C%20c_p和某個誤差https://chart.googleapis.com/chart?cht=tx&chl=%5Cvarepsilon%20_t,為了選擇適當的參數https://chart.googleapis.com/chart?cht=tx&chl=p,可依序假設https://chart.googleapis.com/chart?cht=tx&chl=p%20%3D%200%2C1%2C2%2C%20%5Cdots,代到模型中,直到取得滿意的結果,使得這模型具有不相關的殘差噪音序列且包括最少個數的預測變項。
  4. 求解模型
    利用https://chart.googleapis.com/chart?cht=tx&chl=x%20%3D%20(A%5ET%20A)%5E%7B-1%7DA%5ET%20b,解得https://chart.googleapis.com/chart?cht=tx&chl=a%2C%20b%2C%20c_1%20%2C%20c_2%20%2C%20%5Cdots%20%2C%20c_p。在此以https://chart.googleapis.com/chart?cht=tx&chl=p%20%3D%201的模型來求解
    https://chart.googleapis.com/chart?cht=tx&chl=X_t%20%3D%20a%20%2B%20b%20t%20%2B%20c_1%20X_%7Bt-1%7D,對其取期望值
    https://chart.googleapis.com/chart?cht=tx&chl=%5CRightarrow%20E(X_t)%20%3D%20a%20%2B%20b%20t%20%2B%20c_1%20E(X_%7Bt-1%7D)
    將CM1的資料代入整理可得矩陣形式,
    https://chart.googleapis.com/chart?cht=tx&chl=%5Cleft%20%5B%20%5Cbegin%7Barray%7D%7Bccc%7D%201%20%26%200%20%26%20E(X_0)%20%3D%206.73%20%5C%5C%201%20%26%200%20%26%20E(X_1)%20%3D%206.27%20%5C%5C%20%5Cdots%20%5C%5C%201%20%26%20p-1%20%26%20E(X_%7Bp-1%7D)%20%3D%208.98%20%5Cend%7Barray%7D%5Cright%5D%20%5Cleft%5B%20%5Cbegin%7Barray%7D%20a%20%5C%5C%20b%20%5C%5C%20c%20%5Cend%7Barray%7D%5Cright%5D%20%3D%20https://chart.googleapis.com/chart?cht=tx&chl=%5Cleft%20%5B%20%5Cbegin%7Barray%7D%20E(X_1)%20%3D%206.27%20%5C%5C%20E(X_2)%20%3D%205.93%20%5C%5C%20%5Cdots%20%5C%5C%20E(X_p)%20%3D%208.44%20%5Cend%7Barray%7D%5Cright%5D
    解得https://chart.googleapis.com/chart?cht=tx&chl=X_t%20%3D%201.66%20%2B%200.33%20t%20%2B%200.698%20X_%7Bt-1%7D
    故所求https://chart.googleapis.com/chart?cht=tx&chl=X_%7B48%7D%20%3D%201.66%20%2B%200.033%20*%2048%20%2B%200.698%20*%20X_%7B47%7D(%3D%2010.16)%20%3D%2010.28
    附上程式碼
    import numpy as np
    
    CM1 = [6.73,6.27,5.93,5.77,5.72,5.8,5.87,5.78,5.96,6.03,6.5,7,6.8,6.68,7.03,7.67,7.59,6.96,7.17,6.99,6.64,6.71,7.01,
        7.40,7.49,7.75,8.17,8.09,8.11,8.48,8.99,9.05,9.25,9.57,9.36,8.98,8.44]
    
    t = np.linspace(0, len(CM1)-1, len(CM1))
    
    # 簡單線性回歸
    A = []
    for i in t:
        temp = [1, i]
        A.append(temp)
    
    pinv_A = np.linalg.pinv(np.array(A))
    
    coef = pinv_A.dot(np.array(CM1).reshape(len(CM1),1))
    print(coef)
    
    # 自回歸
    self_A = []
    for i in t:
        if i == len(t) - 1:
            break
        temp = [1, i, CM1[int(i)]]
        self_A.append(temp)
    
    pinv_self_A = np.linalg.pinv(np.array(self_A))
    
    CM1.pop(0)
    
    self_coef = pinv_self_A.dot(np.array(CM1).reshape(len(CM1),1))
    print(self_coef)
    
  5. 說明分析結果
    統計量https://chart.googleapis.com/chart?cht=tx&chl=R%5E%7B2%7D%20%3D%2094.1%25表示此模型組合對該月CM1指數的預測有94.1%的變異解釋量,與昨天的簡單線性回歸模型的83%要來的好。
    下圖是使用自回歸模型所擬合出來的結果
    https://ithelp.ithome.com.tw/upload/images/20190930/20119600AEDO5yxotg.jpg

上一篇
Day 28 : 隨機模型 -- 線性回歸
下一篇
Day 30 : 機率模型的模擬 -- 蒙地卡羅法
系列文
連接數學與現實世界的橋樑 -- 數學建模30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言