QQ图的主要作用是判断样本是否近似于某种类型的分布,这里的“QQ”是两个Quantiles的大写字母,即两个分位数,一个是样本分位数(Sample Quantiles),一般画在纵轴,一个是理论分位数(Theoretical Quantiles),一般画在横轴。
- n <-rnrom(100, 0, 1) #生成100个均值为0,方差为1的正态分布样本
- qqnorm(n)#做变量n的QQ图
以正态分布为例,qqnorm()是判断样本是否近似于正态分布的函数。针对拟判断的样本变量,运行完上述代码,可以得到QQ图。
- q<- qqnorm(n) # 将变量n的QQ图的结果保存到变量q中
- q
运行完结果后,我们想知道结果是怎么计算出来的,换句话说这个(x,y)形式的二维的散点图的坐标是如何确定的。要回答这个问题需要先从qqnorm()入手,把QQ图的结果保存到变量中,再对这个变量进行分析。
返回结果会发现q是一个列表变量
- >q
- $x
- [1] 0.29237490 0.21470157 0.39885507 1.25356544 -1.25356544 -0.37185609 0.24042603
- [8] 0.65883769 -1.43953147 -0.85961736 -2.57582930 0.01253347 -0.59776013 -0.89647336
- ……
- $y
- [1] 0.462814915 0.374278392 0.554904362 1.336120985 -1.185658515 -0.005494698 0.446647652
- [8] 0.856330811 -1.325852442 -0.642461498 -2.655929616 0.255900133 -0.314253761 -0.678510112
- ……
- #这里没有用set.seed()函数生成可重复的模拟样本,所以显示的值可能不同
变量q$y是样本分位数,也是刚才随机产生的100个样本的值,即和变量n是完全一样的,为了验证,如果运行下面的代码,会得到100个“TRUE”
- n <- rnorm(100,0,1)
- qqnorm(n)
- q<- qqnorm(n)
- y <- q$y
- y==n
接下来讨论这个q$x,q$x是理论分位数,之所以是“理论”,指的是如果按照正态分布的假设(qqnorm对应的是正态分布假设,qqpois对应的是泊松分布的假设),这个分位数的理论值应该是多少。例如如果有5个样本,那么理论分位数应该给出的是20%,40%,60%,80%,100%的分位数,但是100%的分位数一般会无限大,因此在这里需要进行一下数据处理,找一个“近似”的理论样本,来替代“真正”的理论样本。在这里问题就在这个“近似”的理论样本的数据处理方法。举个例子,假设P()为正态分布函数,是正态分布函数的反函数,假设一共有N个样本,则第n个样本的“真正”的理论样本分位数应该是\[P^{-1}\left ( \ \right )\],即概率等于n/N时的分位数。关于第n个样本的“近似”的理论样本分位数,数据处理方法有不同版本解释,有人认为是\[P^{-1}\left ( \frac{n-0.5}{N}\right )\](https://bbs.pinggu.org/forum.php?mod=viewthread&tid=2141131&page=1),在薛毅和陈立萍的《统计建模与R软件》(清华大学出版社,2007年)中,计算公式则是\[P^{-1}\left ( \frac{n-0.375}{N+0.25}\right )\],见下图。
我编了几行代码对这个公式进行了验证,结论是用哪一种数据处理方法取决于样本的数量N。如果N小于等于10的时候,分位数的取值应该是\[P^{-1}\left ( \frac{n-0.375}{N+0.25}\right )\],如果样本的数量N大于10,分位数的取值应该是\[P^{-1}\left ( \frac{n-0.5}{N}\right )\]。代码如下。
- N=100#设定样本数量,可以将100改为别的数进行验证
- d <- matrix(nrow= N ,ncol= 3)#生成一个N *3的矩阵
- d[,1]<-1:N#给每一次N的值编上序号
- for(i in 2:N){ #从i=2开始计算,一直计算到i=N
- x <- rnorm(i,0,1) #生成均值为0,、方差为1的i个数的样本,保存到x
- y <- qqnorm(x) #生成样本x的QQ图,保存到变量y
- yy <- sort(y$x) #将QQ图中的理论样本值保存到变量yy中
- yyy<- pnorm(yy,0,1) # 计算分位数yy的概率,保存到yyy中
- a <- 1:i
- ayyy<-lm(a~yyy) #计算公式“ayyy=a*系数+截距“中的参数
- b <-summary(ayyy)$coefficients
- d[i,2]<-b[1,1]#将截距保存到第二列
- d[i,3]<-b[2,1]#将系数保存到第三类
- }
- d
得到结果如下,验证了上述结论:
- > d
- [,1] [,2] [,3]
- [1,] 1 NA NA
- [2,] 2 0.375 2.25
- [3,] 3 0.375 3.25
- [4,] 4 0.375 4.25
- [5,] 5 0.375 5.25
- [6,] 6 0.375 6.25
- [7,] 7 0.375 7.25
- [8,] 8 0.375 8.25
- [9,] 9 0.375 9.25
- [10,] 10 0.375 10.25
- [11,] 11 0.500 11.00
- [12,] 12 0.500 12.00
- [13,] 13 0.500 13.00
- [14,] 14 0.500 14.00
- [15,] 15 0.500 15.00
- [16,] 16 0.500 16.00
- [17,] 17 0.500 17.00
- [18,] 18 0.500 18.00
- [19,] 19 0.500 19.00
- [20,] 20 0.500 20.00
- ……


雷达卡




京公网安备 11010802022788号







