這篇文章講 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 = 有 |
對資料進行一份預處理:
## 讀入 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 無
接下來我們創建需要的列聯表:
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)。
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()
可以計算列聯表物件的相對頻率。何為相對頻率?相對頻率是一種描述事件發生概率的度量方式。表示某個事件發生的次數相對於全部觀察次數的比例。
話不多說上例子:
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()
函式實現隨機抽樣。該函式的定義如下:
sample(x, size, replace = FALSE, prob = NULL)
解釋一下它的引數:
- x:為一長度大於1的任意向量,或是一個正整數。
- size = k:設定所要抽出之樣本數。
- prob:設定每一個個體被抽取之相對應機率或比率之向量,若無設定值,則每一個個體被抽取之相對應機率為相等。
- replace = FALSE:邏輯指令,是否可重複抽取。
如果我們需要復現隨機抽樣的結果,我們需要提前設定種子。例如:
set.seed(123)sample(1:10, size = 3)
這樣,每次運行這兩段程式碼,都會得到相同的結果。