同一数据在R与Python中生成的QQ图有差异,该依赖哪一个?
QQ图与QQ线选择问题
数据
x = c(2.42, 2.59, 3.5, 2.75, 2.78, 3.58, 2.95, 2.06, 2.36, 2.48, 3.33, 2.89)
R语言生成QQ图
使用以下代码生成QQ图:
qqnorm(x) qqline(x)
对应的QQ图:
Python语言生成不同参数的QQ图
先准备数据与导入依赖:
import pandas as pd x = [2.42, 2.59, 3.5, 2.75, 2.78, 3.58, 2.95, 2.06, 2.36, 2.48, 3.33, 2.89] df = pd.DataFrame(x, columns=['x']) import statsmodels.api as sm import matplotlib.pyplot as plt
参数line='s'
sm.qqplot(df['x'], line='s') plt.show()
对应的QQ图:
参数line='r'
sm.qqplot(df['x'], line='r') plt.show()
对应的QQ图:
参数line='q'
sm.qqplot(df['x'], line='q') plt.show()
对应的QQ图:
差异解释与选择建议
这些QQ线的差异源于拟合逻辑不同:
- R的
qqline(x):默认通过第一、第三四分位数拟合直线,和Python中line='q'的逻辑完全一致,两者的QQ线几乎重合。 - Python的
line='s':用标准化样本分位数与理论分位数的最小二乘拟合生成直线,更侧重贴合整体样本分布。 - Python的
line='r':基于原点附近样本点做稳健拟合,对极端值的敏感度更低。
选择哪一种取决于你的分析需求:
- 若要和R的传统输出对齐,优先选
line='q'(和R的qqline结果一致)。 - 若希望直线尽可能贴合多数样本点,选
line='s'。 - 若数据存在极端值,担心其干扰拟合结果,
line='r'的稳健性更合适。
实际上,QQ图的核心是观察样本点是否围绕直线分布,轻微的直线差异不会改变正态性判断——从你的所有图中能看到,样本点都大致贴近直线,说明数据的正态性表现较好。
内容的提问来源于stack exchange,提问作者Catherine
相关产品推荐
相关产品推荐

