本文轉自組學大講堂
T檢驗,亦稱student t檢驗(Student's t test),主要用於樣本含量較小(例如n < 30),總體標準差σ未知的正態分布。T檢驗是用t分布理論來推論差異發生的概率,從而比較兩個平均數的差異是否顯著。在R語言中T檢驗用的方法為:t.test(),如果數據不符合正態分布,也就是數據當中有較大的離群值時,可選用非參數秩和檢驗法,如Wilcoxon test,R語言中對應的方法為:wilcox.test()。關於檢驗方法的選擇可參考:差異統計檢驗如何選擇
單樣品T檢驗例:某魚塘水的含氧量多年平均值為4.5mg/L,現在該魚塘設10點採集水樣,問該次抽樣的水中含氧量與多年平均值是否有顯著差異。
s<-c(4.33,4.62,3.89,4.14,4.78,4.64,4.52,4.55,4.48,4.26)
shapiro.test(s)
t.test(s,mu=4.5)
例:為了了解某一降血壓藥物的效果,將28名高血壓病患者隨機等分到實驗組和對照組,實驗組採用新降壓藥物,對照組則用標準藥物治療,測得治療前後舒張壓的差值如下。問新藥和標準藥的療效是否不同?
high<-c(134,146,106,119,124,161,107,83,113,129,97,123)
low<-c(70,118,101,85,107,132,94)
x<-c(high,low)
group<-c(rep("high",12),rep("low",7))
#正態性檢驗,wilcox.test()
shapiro.test(high) #如果P>0.05 符合正態分布
shapiro.test(low) #如果P>0.05 符合正態分布
#方差齊性檢驗:如果P>0.05 方差齊
bartlett.test(x~group)
#方法二:car包中leveneTest 檢驗,spss統計軟體默認的檢驗方法
leveneTest(x~group)
#T檢驗, 如果 P<0.05 存在差異
t.test(high,low,paired=F,var.equal=T) #如果方差不齊,可更改:var.equal=F,
#或者:
t.test(x~group,paired=F,var.equal=T)
例:為了解DSCT冠狀動脈造影和超聲心動圖檢查兩種方法測定心臟病患者左室舒張末容積的差別,某醫院收集心臟病患者12例,同時分別用兩種檢測方法測得其大小如下,問兩種檢測方法的檢測結果是否不同?
ds<-c(82.5,85.2,87.6,89.9,89.4,90.1,87.8,87.0,88.5,92.4)
cs<-c(91.7,94.2,93.3,97.0,96.4,91.5,97.2,96.2,98.5,95.8)
leveneTest(ds,cs)
d<-ds-cs
shapiro.test(d)
t.test(ds,cs,paired=T,alternative="two.sided",conf.level=0.95)
ggpubr包既可以做檢驗,有可以對統計結果進行整理繪圖,輸出結果比t檢驗更加友好。
例:兩種基因型(HH、RR)的水稻品種,分別在高氮和低氮條件下,的測FW、DW和PH三種生理指標數據:
women_weight <- c(38.9, 61.2, 73.3, 21.8, 63.4, 64.6, 48.4, 48.8, 48.5)
men_weight <- c(67.8, 60, 63.4, 76, 89.4, 73.3, 67.3, 61.3, 62.4)
mydata <- data.frame(
group = rep(c("Woman", "Man"), each = 9),
weight = c(women_weight, men_weight)
)
#統計檢驗
com1 <- compare_means( weight~ group , data = mydata, method = "t.test")
#結果P=0.015,小於0.05,具有顯著差異:
#.y. group1 group2 p p.adj p.format p.signif method
# weight Man Woman 0.0154 0.015 0.015 * T-test
install.packages("ggpubr")
library(ggpubr)
p <- ggboxplot(mydata, x="group", y = "weight", color = "group", palette = "jco", add = "jitter", short.panel.labs = FALSE)
p + stat_compare_means(method = "t.test",label.y=100)
p + stat_compare_means(aes(label = ..p.format..),method = "t.test",label.x = 1.5)
p + stat_compare_means(aes(label = ..p.signif..),method = "t.test",label.x = 1.5)