一直以来都不明白pp和qqplot是怎么做的,最近学习R,终于弄个明白。qq图是正态分位数图,纵坐标是变量的取值,关键是横坐标,参考了以为博友的博客。自己用R写了一个程序验证了一下。基本没问题。
qqplot全名应该是正态分位数图,横坐标的做法:
首先把变量按从小到大的顺序排列,计算变量的长度,即总共有多少个取值,再按顺序计算变量的所有取值的累积百分比,所谓的累积百分比,也就是可以看成是累积概率,比如有10个值,按照从小到大的顺序,第一个值的排序是1, 那么他的所占的百分比就是10%, 紧接着后一个值所占的百分比也会是10%,但是累积概率值为20%, 依次往后计算,因为最后一个值的累积百分比是100%,即等于1,这个值如果计算它的正态分布概率的分位数的话,是无限大的,因此需要对这个值进行修正一下,就是因为这一个值无限大,所以对全体计算出来的累积百分比减去一个适当小的数,修正后的累积百分比与原百分比相差不多,但是回避了最后一个值是1而无法计算的问题。
有了累积百分比之后,相对应的就是累积的概率值。将累积概率值修正后,即得到累积概率,比如以10个值为例,第一个值的累积概率为0.05,查正态分布表,0.05的累积概率,对应的正态分布的Z值为-1.64,这样一次计算,所得的Z值,就是qqplot的横坐标数据。下面以10个数据和30个数据为例说明。
my.qqplot <- function(y){
op <- par(mfrow = c(1, 1))
N <- length(y)
n <- seq(1, N)
xais <- qnorm((n - (.5*N) /N)/ N)
#####中间三句可选,只是为了输出计算过程######
mid <- cbind(sort(y), n, n/N, (n-(.5*N)/N)/N , xais)
colnames(mid) <- c("y", "rank", "cumpercent", "adj-cumper","xaix")
print(mid)
#####中间三句可选,只是为了输出计算过程######
par(mfrow = c(2,1))
qqnorm(y)
plot(sort(y) ~ xais, main = 'my qqplot')
par(op)
}
y <- rnorm(10, mean = 20, s = 50)
my.qqplot(y)
y rank cumpercentadj-cumper xaix
[1,] 2.877321 1 0.1 0.05 -1.6448536
[2,] 6.930063 2 0.2 0.15 -1.0364334
[3,] 16.461444 3 0.3 0.25 -0.6744898
[4,] 36.130825 4 0.4 0.35 -0.3853205
[5,] 40.477883 5 0.5 0.45 -0.1256613
[6,] 50.534636 6 0.6 0.55 0.1256613
[7,] 53.425025 7 0.7 0.65 0.3853205
[8,] 54.554269 8 0.8 0.75 0.6744898
[9,]120.496268 9 0.9 0.85 1.0364334
[10,] 125.290253 10 1.0 0.95 1.6448536