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

2024 年 4 月 11 日
文章摘要
FakeGPT
加載中...
此內容由人工不智慧生成。

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

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

函式說明公式
sum(x)加總和y=Σixiy = \Sigma_i x_i
cumsum(x)累積加總和zj=Σijxiz_j = \Sigma_{i \le j} x_i
diff(x)x[i + 1] - x[i]zi=xi+1xiz_i = x_{i + 1} - x_i
lag(x, k)x[i - k]zi=xikz_i = x_{i - k} ,對應 x[i] 回傳 x[i - k]
lead(x, k)x[i + k]zi=xi+kz_i = x_{i + k} ,對應 x[i] 回傳 x[i + k]
prod(x)乘積y=Πixiy = \Pi_i x_i
cumprod(x)累計乘積zj=Πijxiz_j = \Pi_{i \le j} x_i
mean(x)平均值x=1nΣixi\overline{x} = \frac{1}{n} \Sigma_i x_i
median(x)中位數
var(x)變異數,共變異數s2=1n1Σi(xibarx)2s^2 = \frac{1}{n - 1}\Sigma_i(x_i - barx)^2
sd(x)標準差s=s2s = \sqrt{s^2}
range(x)範圍(min(x), max(x))
min(x)最小值min(x)
max(x)最大值max(x)
quantile(x)百分位數
fivenum(x)五數摘要(min,Q1,median,Q3,max)(min, Q_1, median, Q_3, max)
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 = 死亡
diagtimeKarnofsky 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)

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

[R Lang] R Lang 與高級醫學統計學(7)
https://blog.kynix.tw/posts/1731066164537/
作者
Adrian Chen
建檔時間
2024 年 4 月 11 日
協議
BY-NC-SA 4.0
姓名標示-非商業性-相同方式分享 4.0 國際