<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 十四、回歸的推斷 > 原文:[Inference for Regression](https://github.com/data-8/textbook/tree/gh-pages/chapters/14) > 譯者:[飛龍](https://github.com/wizardforcel) > 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) > 自豪地采用[谷歌翻譯](https://translate.google.cn/) 到目前為止,我們對變量之間關系的分析純粹是描述性的。我們知道如何找到穿過散點圖的最佳直線來繪制。在所有直線中它的估計的均方誤差最小,從這個角度來看,這條線是最好的。 但是,如果我們的數據是更大總體的樣本呢?如果我們在樣本中發現了兩個變量之間的線性關系,那么對于總體也是如此嘛?它會是完全一樣的線性關系嗎?我們可以預測一個不在我們樣本中的新的個體的響應變量嗎? 如果我們認為,散點圖反映了被繪制的兩個變量之間的基本關系,但是并沒有完全規定這種關系,那么就會出現這樣的推理和預測問題。例如,出生體重與孕期的散點圖,顯示了我們樣本中兩個變量之間的精確關系;但是我們可能想知道,對于抽樣總體中的所有新生兒或實際中的一般新生兒,這樣的關系是否是真實的,或者說幾乎是正確的。 一如既往,推斷思維起始于仔細檢查數據的假設。一組假設被稱為模型。大致線性的散點圖中的一組隨機性的假設稱為回歸模型。 ## 回歸模型 簡而言之,這樣的模型認為,兩個變量之間的底層關系是完全線性的;這條直線是我們想要識別的信號。但是,我們無法清楚地看到這條線。我們看到的是分散在這條線上的點。在每一點上,信號都被隨機噪聲污染。因此,我們的推斷目標是將信號從噪聲中分離出來。 更詳細地說,回歸模型規定了,散點圖中的點是隨機生成的,如下所示。 + `x`和`y`之間的關系是完全線性的。我們看不到這個“真實直線”,但它是存在的。 + 散點圖通過將線上的點垂直移動,或上或下來創建,如下所示: + 對于每個`x`,找到真實直線上的相應點(即信號),然后生成噪聲或誤差。 + 誤差從誤差總體中帶放回隨機抽取,總體是均值為 0 的正態分布。 + 創建一個點,橫坐標為`x`,縱坐標為“`x`處的真實高度加上誤差”。 + 最后,從散點圖中刪除真正的線,只顯示創建的點。 基于這個散點圖,我們應該如何估計真實直線? 我們可以使其穿過散點圖的最佳直線是回歸線。 所以回歸線是真實直線的自然估計。 下面的模擬顯示了回歸直線與真實直線的距離。 第一個面板顯示如何從真實直線生成散點圖。 第二個顯示我們看到的散點圖。 第三個顯示穿過散點圖的回歸線。 第四個顯示回歸線和真實直線。 為了運行模擬,請使用三個參數調用`draw_and_compare`函數:真實直線的斜率,真實直線的截距以及樣本量。 運行模擬幾次,用不同的斜率和截距,以及不同的樣本量。 因為所有的點都是根據模型生成的,所以如果樣本量適中,你會看到回歸線是真實直線的一個良好估計。 ```py # The true line, # the points created, # and our estimate of the true line. # Arguments: true slope, true intercept, number of points draw_and_compare(4, -5, 10) ``` ![](https://box.kancloud.cn/a2236f6dd5cb10ed4b40e8b97d84a733_312x751.png) 實際上,我們當然不會看到真實直線。 模擬結果表明,如果回歸模型看起來合理,并且如果我們擁有大型樣本,那么回歸線就是真實直線的一個良好近似。 ## 真實斜率的推斷 我們的模擬表明,如果回歸模型成立,并且樣本量很大,則回歸線很可能接近真實直線。 這使我們能夠估計真實直線的斜率。 我們將使用我們熟悉的母親和她們的新生兒的樣本,來開發估計真實直線的斜率的方法。 首先,我們來看看我們是否相信,回歸模型是一系列適當假設,用于描述出生體重和孕期之間的關系。 ```py correlation(baby, 'Gestational Days', 'Birth Weight') 0.40754279338885108 ``` 總的來說,散點圖看起來相當均勻地分布在這條線上,盡管一些點分布在主云形的周圍。 相關系數為 0.4,回歸線斜率為正。 這是否反映真實直線斜率為正的事實? 為了回答這個問題,讓我們看看我們能否估計真實斜率。 我們當然有了一個估計:我們的回歸線斜率。 這大約是 0.47 盎司每天。 ```py slope(baby, 'Gestational Days', 'Birth Weight') 0.46655687694921522 ``` 但是如果散點圖出現的方式不同,回歸線會有所不同,可能會有不同的斜率。 我們如何計算,斜率可能有多么不同? 我們需要點的另一個樣本,以便我們可以繪制回歸線穿過新的散點圖,并找出其斜率。 但另一個樣本從哪里得到呢? 你猜對了 - 我們將自舉我們的原始樣本。 這會給我們自舉的散點圖,通過它我們可以繪制回歸線。 ### 自舉散點圖 我們可以通過對原始樣本帶放回地隨機抽樣,來模擬新樣本,它的次數與原始樣本量相同。 這些新樣本中的每一個都會給我們一個散點圖。 我們將這個稱為自舉散點圖,簡而言之,我們將調用整個過程來自舉散點圖。 這里是來自樣本的原始散點圖,以及自舉重采樣過程的四個復制品。 請注意,重采樣散點圖通常比原始圖稀疏一點。 這是因為一些原始的點沒有在樣本中被選中。 ![](https://box.kancloud.cn/56a6be4db1a5bc91cd98a8c1f626c2eb_372x751.png) ### 估計真實斜率 我們可以多次自舉散點圖,并繪制穿過每個自舉圖的回歸線。 每條線都有一個斜率。 我們可以簡單收集所有的斜率并繪制經驗直方圖。 回想一下,在默認情況下,`sample`方法帶放回地隨機抽取,次數與表中的行數相同。 也就是說,`sample`默認生成一個自舉樣本。 ```py slopes = make_array() for i in np.arange(5000): bootstrap_sample = baby.sample() bootstrap_slope = slope(bootstrap_sample, 'Gestational Days', 'Birth Weight') slopes = np.append(slopes, bootstrap_slope) Table().with_column('Bootstrap Slopes', slopes).hist(bins=20) ``` ![](https://box.kancloud.cn/b58efe565263c03362dd1fd6e9298fa3_468x298.png) 然后,我們可以使用`percentile `方法,為真實直線的斜率構建約 95% 置信區間。 置信區間從 5000 個自舉斜率的第 2.5 百分位數,延伸到第 97.5 百分位數。 ```py left = percentile(2.5, slopes) right = percentile(97.5, slopes) left, right (0.38209399211893086, 0.56014757838023777) ``` ### 用于自舉斜率的函數 讓我們收集我們估計斜率的方法的所有步驟,并定義函數`bootstrap_slope`來執行它們。 它的參數是表的名稱,預測變量和響應變量的標簽,以及自舉復制品的所需數量。 在每個復制品中,該函數自舉原始散點圖并計算所得回歸線的斜率。 然后繪制所有生成的斜率的直方圖,并打印由斜率的“中間 95%”組成的區間。 ```py def bootstrap_slope(table, x, y, repetitions): # For each repetition: # Bootstrap the scatter, get the slope of the regression line, # augment the list of generated slopes slopes = make_array() for i in np.arange(repetitions): bootstrap_sample = table.sample() bootstrap_slope = slope(bootstrap_sample, x, y) slopes = np.append(slopes, bootstrap_slope) # Find the endpoints of the 95% confidence interval for the true slope left = percentile(2.5, slopes) right = percentile(97.5, slopes) # Slope of the regression line from the original sample observed_slope = slope(table, x, y) # Display results Table().with_column('Bootstrap Slopes', slopes).hist(bins=20) plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8); print('Slope of regression line:', observed_slope) print('Approximate 95%-confidence interval for the true slope:') print(left, right) ``` 當響應變量為出生體重,預測變量為孕期時,我們調用`bootstrap_slope`來找到真實斜率的置信區間,我們得到了一個區間,非常接近我們之前獲得的東西:大約 0.38 到 0.56 盎司每天。 ```py bootstrap_slope(baby, 'Gestational Days', 'Birth Weight', 5000) Slope of regression line: 0.466556876949 Approximate 95%-confidence interval for the true slope: 0.378663152966 0.555005146304 ``` ![](https://box.kancloud.cn/1af48f86363658d0b2eebf58fc6f12e6_468x298.png) 現在我們有一個函數,可以自動完成估計在回歸模型中展示斜率的過程,我們也可以在其他變量上使用它。 例如,我們來看看出生體重與母親身高的關系。 更高的女性往往有更重的嬰兒嗎? 回歸模型似乎是合理的,基于散點圖,但相關性不高。 這只有大約 0.2。 ```py scatter_fit(baby, 'Maternal Height', 'Birth Weight') ``` ![](https://box.kancloud.cn/6021b7e0b29a26965a99c41693ddf168_452x301.png) ```py correlation(baby, 'Maternal Height', 'Birth Weight') 0.20370417718968034 ``` 像之前一樣,我們使用`bootstrap_slope `來估計回歸模型中真實直線的斜率。 ```py bootstrap_slope(baby, 'Maternal Height', 'Birth Weight', 5000) Slope of regression line: 1.47801935193 Approximate 95%-confidence interval for the true slope: 1.0403083964 1.91576886223 ``` ![](https://box.kancloud.cn/c68d1454b51253ed86a8eb5dd578001e_443x298.png) 真實斜率的 95% 置信區間,從約 1 延伸到約 1.9 盎司每英寸。 ### 真實斜率可能為 0 嘛? 假設我們相信我們的數據遵循回歸模型,并且我們擬合回歸線來估計真實直線。 如果回歸線不完全是平的,幾乎總是如此,我們將觀察到散點圖中的一些線性關聯。 但是,如果這種觀察是假的呢? 換句話說,如果真實直線是平的 - 也就是說,這兩個變量之間沒有線性關系 - 我們觀察到的聯系,只是由于從樣本中產生點的隨機性。 這是一個模擬,說明了為什么會出現這個問題。 我們將再次調用`draw_and_compare`函數,這次要求真實斜率為 0。我們的目標是,觀察我們的回歸線是否顯示不為 0 的斜率。 請記住函數`draw_and_compare`的參數是真實直線的斜率和截距,以及要生成的點的數量。 ```py draw_and_compare(0, 10, 25) ``` ![](https://box.kancloud.cn/4dda084c7b49cbeda947e3c60eea13f9_308x751.png) 運行模擬幾次,每次保持真實直線的斜率為 0 。你會注意到,雖然真實直線的斜率為 0,但回歸線的斜率通常不為 0。回歸線有時會向上傾斜,有時會向下傾斜,每次都給我們錯誤的印象,即這兩個變量是相關的。 為了確定我們所看到的斜率是否真實,我們想測試以下假設: 原假設。真實直線的斜率是 0。 備選假設。真實直線的斜率不是 0。 我們很有條件來實現它。由于我們可以為真實斜率構建一個 95% 的置信區間,我們所要做的就是看區間是否包含 0。 如果沒有,那么我們可以拒絕原假設(P 值為 5% 的截斷值)。 如果真實斜率的置信區間確實包含 0,那么我們沒有足夠的證據來拒絕原假設。也許我們看到的斜率是假的。 我們在一個例子中使用這個方法。假設我們試圖根據母親的年齡來估計新生兒的出生體重。根據樣本,根據母親年齡估計出生體重的回歸線的斜率為正,約為 0.08 盎司每年。 ```py slope(baby, 'Maternal Age', 'Birth Weight') 0.085007669415825132 ``` 雖然斜率為正,但是很小。 回歸線非常接近平的,這就產生了一個問題,真實直線是否是平的。 ```py scatter_fit(baby, 'Maternal Age', 'Birth Weight') ``` ![](https://box.kancloud.cn/31084d495c05ea99a8984a8f4af22f69_452x301.png) 我們可以使用`bootstrap_slope`來估計真實直線的斜率。 計算表明,真實斜率的約 95% 的自舉置信區間左端為負,右端為正 - 換句話說,區間包含 0。 ```py bootstrap_slope(baby, 'Maternal Age', 'Birth Weight', 5000) Slope of regression line: 0.0850076694158 Approximate 95%-confidence interval for the true slope: -0.104335243815 0.272791852339 ``` ![](https://box.kancloud.cn/f566e66190f7879fcbf337857772a307_454x298.png) 因為區間包含 0,所以我們不能拒絕原假設,母親年齡與新生兒出生體重之間的真實線性關系的斜率為 0。基于此分析,使用母親年齡作為預測變量,基于回歸模型預測出生體重是不明智的。 ## 預測區間 回歸的主要用途之一是對新個體進行預測,這個個體不是我們原始樣本的一部分,但是與樣本個體相似。在模型的語言中,我們想要估計新值`x`的`y`。 我們的估計是真實直線在`x`處的高度。當然,我們不知道真實直線。我們使用我們的樣本點的回歸線來代替。 給定值`x`的擬合值,是基于`x`值的`y`的回歸估計。換句話說,給定值`x`的擬合值就是回歸線在`x`處的高度。 假設我們試圖根據孕期天數來預測新生兒的出生體重。我們在前面的章節中看到,這些數據非常適合回歸模型,真實直線的斜率的 95% 置信區間不包含 0。因此,我們的預測似乎是合理的。 下圖顯示了預測位于回歸線上的位置。紅線是`x = 300`。 ![](https://box.kancloud.cn/114c4eaf8fbd18d10099759edf777ff3_457x301.png) 紅線與回歸線的相交點的高度是孕期天數 300 的擬合值。 函數`fitted_value`計算這個高度。像函數的相關性,斜率和截距一樣,它的參數是表的名稱和`x`和`y`的列標簽。但是它也需要第四個參數,即`x`的值,在這個值上進行估算。 ```py def fitted_value(table, x, y, given_x): a = slope(table, x, y) b = intercept(table, x, y) return a * given_x + b ``` 孕期天數 300 的擬合值約為 129.2 盎司。 換句話說,對于孕期為 300 天的孕婦,我們估計的新生兒體重約為 129.2 盎司。 ```py fit_300 = fitted_value(baby, 'Gestational Days', 'Birth Weight', 300) fit_300 129.2129241703143 ``` ### 預測的可變性 我們已經開發了一種方法,使用我們樣本中的數據,根據孕期天數預測新生兒的體重。 但作為數據科學家,我們知道樣本可能有所不同。 如果樣本不同,回歸線也會不一樣,我們的預測也是。 為了看看我們的預測有多好,我們必須了解預測的可變性。 為此,我們必須生成新的樣本。 我們可以像上一節那樣,通過自舉散點圖來實現。 然后,我們為每個散點圖的復制品擬合回歸線,并根據每一行進行預測。 下圖顯示了 10 條這樣的線,以及孕期天數 300 對應的出生體重預測。 ![](https://box.kancloud.cn/856964a84921a6e7a904ef1280183c11_434x278.png) ```py lines ``` | slope | intercept | prediction at x=300 | | --- | --- | --- | | 0.503931 | -21.6998 | 129.479 | | 0.53227 | -29.5647 | 130.116 | | 0.518771 | -25.363 | 130.268 | | 0.430556 | -1.06812 | 128.099 | | 0.470229 | -11.7611 | 129.308 | | 0.48713 | -16.5314 | 129.608 | | 0.51241 | -23.2954 | 130.428 | | 0.52473 | -27.2053 | 130.214 | | 0.409943 | 5.22652 | 128.21 | | 0.468065 | -11.6967 | 128.723 | 每一行的預測都不相同。 下表顯示了 10 條線的斜率、截距以及預測。 ### 自舉預測區間 如果我們增加重采樣過程的重復次數,我們可以生成預測的經驗直方圖。這將允許我們創建預測區間,使用為斜率創建自舉置信區間時的相同的百分比方法。 讓我們定義一個名為`bootstrap_prediction`的函數來實現。該函數有五個參數: + 表的名稱 + 預測變量和響應變量的列標簽 + 用于預測的`x`的值 + 所需的自舉重復次數 在每次重復中,函數將自舉原始散點圖,并基于`x`的指定值查找`y`的預測值。具體來說,它調用我們在本節前面定義的函數`fitted_value`,來尋找指定`x`處的擬合值。 最后,繪制所有預測值的經驗直方圖,并打印由預測值的“中間 95%”組成的區間。它還打印基于穿過原始散點圖的回歸線的預測值。 ```py # Bootstrap prediction of variable y at new_x # Data contained in table; prediction by regression of y based on x # repetitions = number of bootstrap replications of the original scatter plot def bootstrap_prediction(table, x, y, new_x, repetitions): # For each repetition: # Bootstrap the scatter; # get the regression prediction at new_x; # augment the predictions list predictions = make_array() for i in np.arange(repetitions): bootstrap_sample = table.sample() bootstrap_prediction = fitted_value(bootstrap_sample, x, y, new_x) predictions = np.append(predictions, bootstrap_prediction) # Find the ends of the approximate 95% prediction interval left = percentile(2.5, predictions) right = percentile(97.5, predictions) # Prediction based on original sample original = fitted_value(table, x, y, new_x) # Display results Table().with_column('Prediction', predictions).hist(bins=20) plots.xlabel('predictions at x='+str(new_x)) plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8); print('Height of regression line at x='+str(new_x)+':', original) print('Approximate 95%-confidence interval:') print(left, right) bootstrap_prediction(baby, 'Gestational Days', 'Birth Weight', 300, 5000) Height of regression line at x=300: 129.21292417 Approximate 95%-confidence interval: 127.300774171 131.361729528 ``` ![](https://box.kancloud.cn/e7a7d8d4747b0102ee74e5a039618f64_448x298.png) 上圖顯示了基于 5000 次重復的自舉過程,孕期天數 300 的預測出生體重的自舉經驗直方圖。經驗分布大致是正泰的。 我們已經通過預測的“中間 95%”,即預測的第 2.5 百分位數到第 97.5 百分位數的區間,構建了分數的約 95% 的預測區間。 區間范圍從大約 127 到大約 131。基于原始樣本的預測是大約 129,接近區間的中心。 ### 改變預測變量的值的效果 下圖顯示了孕期天數 285 的 5,000 次自舉預測的直方圖。 基于原始樣本的預測是約 122 盎司,區間范圍從約 121 盎司到約 123 盎司。 ```py bootstrap_prediction(baby, 'Gestational Days', 'Birth Weight', 285, 5000) Height of regression line at x=285: 122.214571016 Approximate 95%-confidence interval: 121.177089926 123.291373304 ``` ![](https://box.kancloud.cn/81010f778a0d68b7b0c5ab6241ad1933_454x298.png) 請注意,這個區間比孕婦天數 300 的預測區間更窄。 讓我們來調查其原因。 孕婦天數均值約為 279 天: ```py np.mean(baby.column('Gestational Days')) 279.10136286201021 ``` 所以 285 比 300 更接近分布的中心。 通常,基于自舉樣本的回歸線,在預測變量的分布中心附近彼此更接近。 因此,所有的預測值也更接近。 這解釋了預測區間的寬度更窄。 你可以在下面的圖中看到這一點,它顯示了 10 個自舉復制品中每一個的`x = 285`和`x = 300`的預測值。 通常情況下,直線在`x = 300`處比`x = 285`處相距更遠,因此`x = 300`的預測更加可變。 ![](https://box.kancloud.cn/70ebef2fbe19371088089e86f6991ed5_434x278.png) ### 注意事項 我們在本章中進行的所有預測和測試,都假設回歸模型是成立的。 具體來說,這些方法假設,散點圖中的點由直線上的點產生,然后通過添加隨機正態噪聲將它們推離直線。 如果散點圖看起來不像那樣,那么模型可能不適用于數據。 如果模型不成立,那么假設模型為真的計算是無效的。 因此,在開始基于模型進行預測,或者對模型參數進行假設檢驗之前,我們首先要確定回歸模型是否適用于我們的數據。 一個簡單的方法就是,按照我們在本節所做的操作,即繪制兩個變量的散點圖,看看它看起來是否大致線性,并均勻分布在一條線上。 我們還應該使用殘差圖,執行我們在前一節中開發的診斷。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看