應用統計學與R語言實現筆記(番外篇四)——bookdown使用與OR值計算

本期是之前做的應用統計學與R語言實現筆記的番外篇四,本期主要關注兩個問題,一個是重新利用R的bookdown包創建新的電子書,另一個是計算公共衛生當中一個比較常見的指標OR值。

1 bookdown使用

bookdown是謝益輝之前開發的R語言包,可以基於rmarkdown快速生成在線電子書,並且可以輸出pdf和epub。具體的使用方法可以參見官方文檔。

https://bookdown.org/yihui/bookdown/

這裏由於中文在輸出pdf中容易有bug,因此中文圖書推薦使用謝益輝提供的模板進行修改。同時可以參考李東風的這本中文使用指南輔助進行。

https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/

這裏提供一些使用過程中的tips經驗。

  • Latex公式在在$與公式間不要空格。
  • 插入圖片建議使用r的function。例子如下:
knitr::include_graphics("fig/fig1.jpg")

其中include_graphics括號後面爲圖片路徑。同時在R code的設置裏,在設置圖片大小時推薦使用out.width和out.height參數,設置爲'100%',這樣圖片可以根據排版情況進行自適應。

  • 如果想加入r代碼塊而不想運行僅作爲展示的話,需要在R code的設置裏設置爲r eval=FALSE, echo = T。
  • 目前這個版本的封面圖片設置參數cover-image只能生成epub裏的封面,pdf無法添加。
  • 默認模板會生成圖和表目錄,不需要的可以在index.rmd的輸出設置裏把lot和lof設置爲false。
  • 默認模板pdf裏有一句話“獻給……呃,愛誰誰吧”,需要在模板的latex文件夾下的before_body.tex裏去掉。
  • 默認模板設置是B5的紙張大小,邊距設置也是左右不對稱。這個是在index.rmd的輸出設置裏。實際上也是latex的設置。可根據自己喜好做調整。
geometry: [b5paper, tmargin=2.5cm, bmargin=2.5cm, lmargin=3.5cm, rmargin=2.5cm]
  • 用github託管的話,可以在bookdown.yml文件裏設置輸出文件夾參數,在最後一行添加參數(output_dir: "docs")。然後在github的Pages設置對應的根目錄。同時需要在R裏輸入如下命令。讓網頁不使用默認jekyll主題。
file.create('docs/.nojekyll')

最後奉上最新的bookdown在線電子書地址:

http://gisersqdai.top/Note-of-Applied-Statistics-with-R-Book/

2 公式更正

在修改的過程裏,我發現了來自BruceZhaoR同學18年的一條pr,雖然不知道什麼原因我一直沒注意到這條pr。這裏鄭重向這位同學道歉,非常感謝他的指正。他指出在原本第三章描述性統計裏的樣本方差與標準差公式裏有誤。並給出了wiki上的參考公式。

wiki:https://en.wikipedia.org/wiki/Standard_deviation#Corrected_sample_standard_deviation

具體錯誤這裏也說明下。原公式如下:

樣本方差:

$$s^2=\frac{\sum_{i=1}^N (x_i-\mu)^2}{n-1}$$ 或 $$s^2=\frac{\sum_{i=1}^k (M_i-\mu)^2f_i}{n-1}$$

樣本標準差:

$$s=\sqrt {\frac{\sum_{i=1}^N (x_i-\mu)^2}{n-1}}$$ 或 $$s=\sqrt{\frac{\sum_{i=1}^k (M_i-\mu)^2f_i}{n-1}}$$

這裏用$\mu$是不對的,$\mu$雖然可以指代統計學中的均值,但是$\mu$是代表總體均值。而嚴格來說,樣本均值通常只是近似總體均值,因此必須作區分,故常用$\bar x$來做爲樣本均值。故修改後公式爲

樣本方差:

$$s^2=\frac{\sum_{i=1}^N (x_i-\bar x)^2}{n-1}$$ 或 $$s^2=\frac{\sum_{i=1}^k (M_i-\bar x)^2f_i}{n-1}$$

樣本標準差:

$$s=\sqrt {\frac{\sum_{i=1}^N (x_i-\bar x)^2}{n-1}}$$ 或 $$s=\sqrt{\frac{\sum_{i=1}^k (M_i-\bar x)^2f_i}{n-1}}$$

3 OR值計算

由於我目前主要從事健康地理學方面的研究,最近碰上了一個基礎的OR值計算問題。首先OR值的全稱是odds ratio值,這是公共衛生領域的一個專業名詞。這裏給出Encyclopedia of Public Health的定義。

The odds ratio (OR) provides a measure of the strength of relationship between two variables, most commonly an exposure and a dichotomous outcome. It is most commonly used in a case control study where it is defined as “the ratio of the odds of being exposed in the group with the outcome to the odds of being exposed in the group without the outcome.”

This concept can be extended to a situation with multiple levels of exposure (e.g., low, moderate, or high exposure to an environmental containment). One exposure level is assigned as the “reference” level. For each of the remaining exposure levels, one divides the odds of that exposure level in the outcome positive group (compared with the reference level) by the odds of that exposure level in the outcome negative group.

The OR ranges in value from 0 to infinity. Values close to 1.0 indicate no relationship between the exposure and the outcome. Values less than 1.0 suggest a protective effect, while values greater than 1.0 suggest a causative or adverse effect of exposure.

這裏簡單翻譯一下,OR值是用來度量兩個變量之間關係強度的指標,常見於暴露水平與二分的健康結局變量。最常用在案例對照研究。OR被定義爲“組中暴露患病機率與暴露未患病機率的比值”。這個概念通常可以拓展到多水平暴露指標,通常定義某一類別的暴露水平爲參考水平,對於剩餘的暴露水平,則除以該參考水平的暴露機率用來進行比較。這裏要先給出odds的定義。odds,稱爲機率、比值、比數,是指某事件發生的可能性(概率)與不發生的可能性(概率)之比。用p表示事件發生的概率,則:odds = p/(1-p)。OR值的公共衛生意義如下:範圍從0到無窮大。接近1.0的值表示暴露與結果之間沒有關係。小於1.0的值表示保護作用,而大於1.0的值表示暴露的致病性或不利影響。

針對一個標準的2x2流病表格(如下)。實際上OR值計算如下:

$$暴露時患病機率=\frac{暴露時患病病例數}{未暴露時患病病例數}=\frac{a}{c}$$

$$暴露時未患病機率=\frac{暴露時未患病病例數}{未暴露時未患病病例數}=\frac{b}{d}$$

$$OR = \frac{a/c}{b/d}=\frac{ad}{bc}$$

Outcome +ve Outcome -ve
Exposed a b
No exposed c d

這裏選用一個ICU的數據來進行說明,這個數據來源於David W. Hosmer等人出版的applied logistic regression一書中的數據。獲取途徑可以通過安裝這個書的r包,命令如下。

install.packages('aplore3')

安裝完成以後,載入數據做個初步探索。

library(aplore3)
data(icu)
head(icu)

爲了簡單化,我們這裏定義健康結局變量爲status,即數據中的sta(Lived或者Died),感興趣的自變量爲age。首先繪製一下圖。由於status是個二分變量。所以圖就變成了如下的樣子。

你是否覺得很熟悉?其實這就是logistic regression的典型數據。那麼根據age的數據,我們做一個處理,統計不同年齡段的死亡率,以10歲爲分界線。我們可以得到如下的圖。

那麼我們突然發現,這個散點是有線性趨勢的。假設我們採用線性迴歸來做分析,即假定有:$pr(death)=\beta_0+\beta_1(age)$,不就可以擬合了嗎?但是我們又會發現一個問題。那就是這裏的y(pr(death))是有現實意義的實數,也就是它的值域必須在(0,1)中。然而等式右邊實際上是可以取任何值的(根據$\beta_0 , \beta_1, age$),因此這個線性方程即使求解出來,預測值通常會超過實際的值域。所以爲了解決這個問題,logistics regression就提出了。首先是定義了logit函數爲:

$$logit(p)=log(\frac{p}{1-p})$$

$$p=pr(death)$$

那麼這個logit函數的現實意義是事件發生機率的對數。那麼同時模型就變成了:

$$log(\frac{p}{1-p})=\beta_0+\beta_1(age)$$

這時我們就會發現p的值域是在(0,1),而logit(p)的值域則是$[ - \infty, + \infty ]$

那這個時候我們就可以用線性迴歸方法求解係數了,因此logistic regression也被稱爲廣義線性迴歸的一類。

那麼我們再來看一個更特殊的情況,就是前面說的2x2聯表的情況。假定自變量是個分類變量。這裏選用icu數據裏的type來分析(健康結局變量不變)。也就是說方程如下:

$$logit(p)=\beta_0+\beta_1(I_{type})$$

2x2聯表則爲:

Lived Died
elective admission a b
emeregency admission c d

那麼這時候$I_{type}=0$時是elective admission,$I_{type}=1$時是emeregency admission。因此我們可以得到對應的y值。也就是elective adminssion的logit(p)爲$\beta_0$。而emergency admission的logit(p)爲$\beta_0+\beta_1$。那麼根據logit函數的定義,我們就有如下的式子:

對elective adminssion的odds:

$$odds_{ele}=\frac{p}{1-p}=\frac{a}{b}=e^{\beta_0}$$

對emergency adminssion的odds:

$$odds_{eme}=\frac{p}{1-p}=\frac{c}{d}=e^{\beta_0+\beta_1}$$

那麼所以這個OR值就可以計算:

$$OR =\frac{ad}{bc} =odds_{ele}/odds_{eme}=\frac{a}{b}/\frac{c}{d}=e^{\beta_0+\beta_1}/e^{\beta_0}=e^{\beta_0+\beta_1-\beta_0}=e^{\beta_1}$$

也就是說,實際上OR值就是e的logistics regression中的迴歸係數次方。因此通常在公共衛生研究中求OR值,第一步就是先做logistics regression然後接着進行計算。對應其實也可以計算OR的95%置信區間以及p值(Explaining Odds Ratios)。這塊這裏就不詳述了。我這裏還是採用icu數據做個樣例分析,展示三種方式(第一種不借助其他包,第二個使用epiDisplay,第三個是用questionr)求OR。

## 1 without any packages
modellogit <- glm(sta~type, data = icu, family = binomial)
ORDF <- data.frame(exp(cbind(OR = coef(modellogit), confint(modellogit))))
ORDF

## 2 Using epiDisplay
install.packages('epiDisplay')
library(epiDisplay)
modellogit <- glm(sta~type, data = icu, family = binomial)
ORDF <- logistic.display(modellogit)
ORDF

## 3 Using questionr
install.packages('questionr')
library(questionr)
modellogit <- glm(sta~type, data = icu, family = binomial)
ORDF <- odds.ratio(modellogit)
ORDF

目前個人推薦第三種,能把p值一起算出來,這裏要注意R裏面默認factor的第一個因子作爲參考組(baseline),如需要設置不同的參考組。可以用如下的函數。

icu$type <- relevel(icu$type, ref = "emergency")

最後本次的代碼也都是在之前的github項目上。歡迎大家使用。最後再放一下兩個項目地址:

Note-of-Applied-Statistics-with-R

Note-of-Applied-Statistics-with-R-Book

參考鏈接:

  1. Logistic regression for a Yes/No outcome

  2. Confused with the reference level in logistic regression in R

  3. Logistic regression - defining reference level in R

  4. Reference category and interpreting regression coefficients in R

  5. Confidence Intervals for RRs, ORs in R

  6. How to calculate the p.value of an odds ratio in R?

  7. Calculating Odds Ratio in R

  8. Odds ratios and logistic regression: further examples of their use and interpretation

  9. BMI 541/699 Lecture 22

  10. aplore3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章