生信统计学1 - T检验和Z检验

假设检验通过统计学手段判断样本数据是否支持某个假设,从而基于数据作出推断。

1. T检验(T-test)

T检验适用于比较2个样本平均值之间是否存在显著差异

1.1 T检验原理

假设2个样本有相同的分布,如果2个样本平均值差异显著,则表明两者可能为不同分布。

原假设(H0):2个样本平均值无显著差异,即 μ1=μ2。

备择假设(H1):2个样本平均值有显著差异,即 μ1≠μ2 。

1.2 T检验公式

对于独立样本t检验(又称为双样本t检验):

分子表示2个样本的平均值之差,分母表示2个样本各自方差平方比上样本数量的算术平方根。

从下图公式可以看出,T检验需要计算t值,通过其判断2个样本平均值是否存在显著差异
T检验公式

结论:

t值通过查找t分布表可得到p值,p值越小,越说明样本间差异显著;如果p值小于显著性水平阈值(通常为0.05),则拒绝原假设H0

1.3 T检验适用范围:

T检验计算简单,适用于正态分布的样本数据,并要求比较样本之间方差大小相差较小;但当样本分布为非正态分布且样本数量较少,T检验一般不太适用

在实际应用中,可用于比较实验组和控制组的2个样本的均值差异是否显著。

1.4 python实现实验组数据和对照组数据的T检验

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 生成2个不同均值的样本数据(实验 VS 对照)
np.random.seed(123)
# 平均值为10,标准差为3,数据数量100个
experiment_data = np.random.normal(10, 3, 100)  
 # 平均值为15,标准差为4,数据数量100个
control_data = np.random.normal(15, 4, 100) 

# t-test 两组数据的均值
t_stat, p_value = stats.ttest_ind(experiment_data, control_data)
print(f"T-value: {t_stat}, P-value: {p_value}")
# T-value: -9.353755620233024, P-value: 1.8665012625102836e-17

####### 核密度图 ########
# 设置图大小
plt.figure(figsize=(10, 6))
sns.kdeplot(experiment_data, label="experiment data (Mean=10)", shade=True)
sns.kdeplot(control_data, label="control data (Mean=15)", shade=True)
plt.legend()
plt.show()

####### 箱线图 #######
sns.boxplot(data=[experiment_data, control_data])
plt.xticks([0, 1], ["experiment data", "control data"])

plt.suptitle("T-Test between experiment and control", fontsize=12)
plt.tight_layout()
plt.show()

结论:

t值(T-value: -9.353755620233024),p值(P-value: 1.8665012625102836e-17)小于0.05,拒绝原假设H0即2个样本数据集存在显著差异

核密度图

核密度图曲线峰值为2个数据集的平均值,反应了2个数据集的数据分布情况。
核密度图

箱线图

箱线图上横线和下横线分别表示上四分位数、下四分位数,箱子中间横线表示平均值,原点表示异常值,可直观看出2个数据集在均值上的差异。

箱线图

2. Z检验(Z-test)

Z检验主要用于样本数量较多已知总体的标准差的情况,可检验单个样本与总体样本平均值之间的差异,也可以比较2个样本之间平均值的差异。

2.1 Z检验原理

原假设(H0):样本均值与总体均值无显著差异,或两个样本均值无显著差异
备择假设(H1):样本均值与总体均值有显著差异,或两个样本均值有显著差异

2.2 Z检验公式

Z检验公式

|Z|值与P值结论

Z值与p值结论图

2.3 Z检验适用范围:

样本较大、已知标准差,并不适用于小样本数据。

2.4 python实现单个样本和总体样本的Z检验

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats


# 已知总体均值和方差数据
# 假设总体均值为15,总体SD为3.5,样本数量100个,进行单样本z检验
total_mean = 15
total_sd = 3.5
n = 100

np.random.seed(123)
# 从正态分布总体数据中获取样本数据
sample = np.random.normal(total_mean , total_sd , n)

# 求样本均值和标准差
sample_mean = np.mean(sample)
sample_std = np.std(sample, ddof=1)

# 计算公式
p_value = 2 * (1 - stats.norm.cdf(abs((sample_mean - total_mean) / (total_sd / np.sqrt(n)))))

print(f"Z-value: {z_stat}, P-value: {p_value}")
# z_value: -3.9513638778274593, P-value: 7.770706713938758e-05

plt.figure(figsize=(10, 6))

# 核密度图
sns.kdeplot(sample, label="Sample Distribution", shade=True)

# 添加总体均值和假设均值的竖线
plt.axvline(np.mean(sample), linestyle='--', label='Sample Mean')
plt.axvline(total_mean, color='red', linestyle='--', label='Total sample Mean')

plt.legend()
plt.title("Z-Test")
plt.tight_layout()
plt.show()

Z检验结论:
通过z统计量和p值,我们可以判断样本均值与假设均值是否有显著差异。如果p值小于0.05,则拒绝原假设;上述z-value绝对值2.68且大于p-value小于0.01, 单样本与总体均值差异非常显著

### Fine-Gray检验与竞争风险模型 Fine-Gray检验是一种用于分析存在竞争风险数据的方法,它通过亚分布危险比例模型来评估协变量对事件发的影响[^1]。该方法特别适用于当研究中有多个互斥的结果(即竞争事件),而这些事件会干扰目标事件的发概率的情况。 #### 竞争风险模型概述 竞争风险模型的核心在于区分不同类型的失败模式,并估计每种模式下的累积发病率函数 (Cumulative Incidence Function, CIF)[^2]。CIF提供了特定原因下事件发的概率,考虑了其他竞争事件的存在。这种方法相较于传统的Kaplan-Meier存曲线更为精确,因为它能够处理多种可能的竞争结局。 在医学领域中,例如患者可能会因疾病恶化死亡或者由于治疗副作用去世等情况都属于典型的竞争风险场景;而在息学方面,则可以应用于基因表达水平预测癌症复发时间等问题上。 ### 列线图及其绘制方式 列线图(Nomogram),作为一种直观展示统计模型预测能力工具,在临床决策支持系统里占据重要地位。它可以将复杂的回归方程简化成易于理解和使用的图形界面形式供医快速判断预后情况或制定个性化诊疗方案之用。 以下是利用R语言实现上述功能的一个简单例子: ```r library(survival) library(cmprsk) # 假设dataframe df包含time(随访时间), status(状态指示器0=删失; 1=目标事件; 2=竞争事件) 和 covariates(x1,x2...) fit <- crr(df$time, df$status, model.matrix(~x1+x2,data=df)) summary(fit) # 绘制Nomogram library(rms) ddist <- datadist(df); options(datadist='ddist') nom_model <- npsurv(Surv(time,status==1)~., data=df) nom <- nomogram(nom_model, fun=function(x) summary(psm(Surv(time,status==1)~., data=df))[,"S",]) plot(nom) ``` 对于Python用户来说,虽然不像R那样有专门针对此目的开发成熟的库文件可以直接调用,但仍可通过`lifelines`, `scikit-survival`等包间接达成类似效果: ```python from sksurv.linear_model import CoxPHSurvivalAnalysis import pandas as pd X = ... # 特征矩阵 y = ... # 结构化数组 [(布尔值表示是否经历事件的时间戳)] model = CoxPHSurvivalAnalysis() model.fit(X,y) def predict_risk(model, X_new): surv_funcs = model.predict_survival_function(X_new) times_of_interest = np.linspace(y["event"].min(), y["event"].max(), num=100) risks = [] for fn in surv_funcs: risk_at_time = 1 - fn(times_of_interest).mean() risks.append(risk_at_time) return risks risks = predict_risk(model, test_data_features) ``` 至于SAS软件平台上的操作流程则相对繁琐一些,主要依赖宏程序配合PROC PHREG完成相应计算过程后再手动调整输出结果形成最终可视化的列线图表单。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信与基因组学

每一份鼓励是我坚持下去动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值