[R Lang] R Lang與高級醫學統計學(7)
Adrian Chen

這篇文章講R Lang中的基本統計函式。

在很多年前,我們第一次學習Excel試算表處理的時候,就擁有這樣的一些函式,比如sum()average()等等。在R Lang中,我們仍然可以使用下面的一些統計函式,來進行基本的統計工作。

函式 說明 公式
sum(x) 加總和
cumsum(x) 累積加總和
diff(x) x[i + 1] - x[i]
lag(x, k) x[i - k] ,對應x[i]回傳x[i - k]
lead(x, k) x[i + k] ,對應x[i]回傳x[i + k]
prod(x) 乘積
cumprod(x) 累計乘積
mean(x) 平均值
median(x) 中位數
var(x) 變異數,共變異數
sd(x) 標準差
range(x) 範圍 (min(x), max(x))
min(x) 最小值 min(x)
max(x) 最大值 max(x)
quantile(x) 百分位數
fivenum(x) 五數摘要
sample(x) 隨機抽樣 random sample

類別資料表格函式

列聯表(contingency table)通常被用來處理類別型資料。它將資料分組並統計每個組別中的頻率或計數。列聯表提供了一個簡單的方式來了解變量之間的關聯性和分布情況。在講factor因子型變數的時候,我們簡單涉及到這部分內容。簡單來講,類別型資料表示不同的類別或群體,而非連續性資料。可以分為名義型資料和有序型資料:

  • 名義型資料(Nominal data):名義型資料是沒有內在順序或等級的類別型資料。它表示不同的類別或群體,但沒有任何順序。例如,性別(男、女)和眼睛顏色(藍、綠、棕等)就是名義型資料。
  • 有序型資料(Ordinal data):有序型資料是具有固定順序或等級的類別型資料。它表示不同的類別或群體,並且這些類別之間存在著順序關係。例如,教育程度(小學、中學、大學)和商品評級(差、中、好)就是有序型資料。

類別型資料在統計分析中很常見,例如進行列聯分析、卡方檢定和建立分類模型等。

創建列聯表

使用table()xtabs()函式來從向量等物件創建一個列聯表。使用函式xtabs()可以從資料框架中, 利用統計模型公式(model formula)創造一個列聯表。

常用引數如下:

  • formula:使用統計模型公式輸入
  • data:資料框架名
  • na.action = “na.omit”:缺失值處理方式
  • exclude:排除類別水準的細項,自動內設排除缺失值
  • useNA:處理缺失值選項
  • “no”:排除缺失值
  • “ifany”:納入缺失值,若類別水準的計數(count)為正整數
  • “always”:永遠納入缺失值成為1類別水準。即使類別水準的計數(count)為0仍然自成1個類別水準

我們準備了一份資料,這是一份關於年長退伍軍人罹患肺癌, 且無法接受手術之臨床試驗。相關的csv檔案可以在我的下載站免費下載。檔案名字是survVATrial.csv

我們首先解釋一下其中的變數:

變數 描述
threat(therapy) 治療組別:0 = 標準;1 = 新治療
cellcode 細胞型態:1 = 鱗狀細胞;2 = 小細胞;3 = 腺體細胞;4 = 大細胞
time 存活時間,診斷日期至死亡日期,單位以日計
censor 設限狀態: 0 = 存活,1 = 死亡
diagtime Karnofsky performance score,診斷時身體狀態表現的分數
kps 診斷到隨機分配的時間,以月計
age 診斷時的年齡(以年計)
prior 先前是否接受治療;0 = 無;1 = 有

對資料進行一份預處理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## 讀入csv資料
file <- read.csv("./survVATrial.csv", header = TRUE, as.is = TRUE)

## 資料預處理
file$threat <- factor(file$threat, levels = c(0, 1), labels = c("標準", "新治療"))

file$cellcode <- factor(file$cellcode, levels = c(1, 2, 3, 4), labels = c("鱗狀細胞", "小細胞", "線體細胞", "大細胞"))

file$censor <- factor(file$censor, levels = c(0, 1), labels = c("生存", "死亡"))

file$prior <- factor(file$prior, levels = c(0, 10), labels = c("無", "有"))

## 查看
head(file)
## threat cellcode time censor diagtime kps age prior
## 1 標準 鱗狀細胞 72 死亡 60 7 69 無
## 2 標準 鱗狀細胞 411 死亡 70 5 64 有
## 3 標準 鱗狀細胞 228 死亡 60 3 38 無
## 4 標準 鱗狀細胞 126 死亡 60 9 63 有
## 5 標準 鱗狀細胞 118 死亡 70 11 65 有
## 6 標準 鱗狀細胞 10 死亡 20 5 49 無

接下來我們創建需要的列聯表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tb <- table(file$censor)
tb
## 生存 死亡
## 0 6

tb <- table(file$censor, file$cellcode)
tb
## 鱗狀細胞 小細胞 線體細胞 大細胞
## 生存 0 0 0 0
## 死亡 6 0 0 0

tb_2 <- xtabs(~ censor + cellcode, data = file)
tb_2
## cellcode
## censor 鱗狀細胞 小細胞 線體細胞 大細胞
## 生存 0 0 0 0
## 死亡 6 0 0 0

table()函式和xtabs()函式對於高維度列聯表的呈現以list形式,較不方便操作,可以改用函式ftable(),從任意向量、矩陣、陣列、資料框架創造一個扁平列聯表。變數(欄位,column)為分類因子變數,另外再加上各組頻率數目,每一列(row)代表每一種分類的類別水準(level)。

1
2
3
4
5
6
7
8
9
10
11
12
tb_3 <- ftable(file$cellcode, file$threat, file$censor)
tb_3
## 生存 死亡

## 鱗狀細胞 標準 0 6
## 新治療 0 0
## 小細胞 標準 0 0
## 新治療 0 0
## 線體細胞 標準 0 0
## 新治療 0 0
## 大細胞 標準 0 0
## 新治療 0 0

計算列聯表的邊際總和及相對頻率

使用margin.table()函式可以計算列聯表的邊際總和。何為邊際總和?這是一個統計概念。是指在多維度資料表中,計算每個維度的總和或計數。它提供了對資料的不同維度的總體概覽。prop.table()可以計算列聯表物件的相對頻率。何為相對頻率?相對頻率是一種描述事件發生概率的度量方式。表示某個事件發生的次數相對於全部觀察次數的比例。

話不多說上例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
tb_2 <- xtabs(~ censor + cellcode, data = file)
tb_2
## cellcode
## censor 鱗狀細胞 小細胞 線體細胞 大細胞
## 生存 0 0 0 0
## 死亡 6 0 0 0

## margin.table()計算邊際總和
## margin引數預設為NULL,表示計算tb_2的所有元素和
mtb_1 <- margin.table(tb_2)
mtb_1
## [1] 6

## margin = 1計算第一維度(列位(row)邊際總和)
mtb_2 <- margin.table(tb_2, margin = 1)
mtb_2
## censor
## 生存 死亡
## 0 6

## margin = 2計算第二維度(欄位(column)邊際總和)
mtb_3 <- margin.table(tb_2, margin = 2)
mtb_3
## cellcode
## 鱗狀細胞 小細胞 線體細胞 大細胞
## 6 0 0 0

## prop.table()計算相對頻率
ptb_1 <- prop.table(tb_2)
ptb_2 <- prop.table(tb_2, margin = 1)
ptb_3 <- prop.table(tb_2, margin = 2)

隨機抽樣函式

使用sample()函式實現隨機抽樣。該函式的定義如下:

1
sample(x, size, replace = FALSE, prob = NULL)

解釋一下它的引數:

  • x:為一長度大於1的任意向量,或是一個正整數。
  • size = k:設定所要抽出之樣本數。
  • prob:設定每一個個體被抽取之相對應機率或比率之向量,若無設定值,則每一個個體被抽取之相對應機率為相等。
  • replace = FALSE:邏輯指令,是否可重複抽取。

如果我們需要復現隨機抽樣的結果,我們需要提前設定種子。例如:

1
2
set.seed(123)
sample(1:10, size = 3)

這樣,每次運行這兩段程式碼,都會得到相同的結果。