normal.test.R 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. norm.test <- function(x, breaks = 20, alpha = 0.05,
  2. plot = TRUE){
  3. if(plot == TRUE)
  4. {#设置图形界面(多图合为一张图)
  5. opar <- par(no.readonly = TRUE)
  6. layout(matrix(c(1,1,2,3),2,2,byrow = TRUE),
  7. width = c(2,2),heights = c(2,2))
  8. #绘制直方图
  9. hist(x, freq = FALSE, breaks = seq(min(x),
  10. max(x), length = breaks), main = 'x的直方图',
  11. ylab = '核密度值')
  12. #添加核密度图
  13. lines(density(x), col = 'red', lty = 1, lwd = 2)
  14. #添加正态分布图
  15. x <- x[order(x)]
  16. lines(x, dnorm(x, mean(x), sd(x)),
  17. col = 'blue', lty = 2, lwd = 2.5)
  18. #添加图例
  19. legend('topright',
  20. legend = c('核密度曲线','正态分布曲线'),
  21. col = c('red','blue'), lty = c(1,2),
  22. lwd = c(2,2.5), bty = 'n')
  23. #绘制Q-Q图
  24. qqnorm(x, xlab = '实际分布', ylab = '正态分布',
  25. main = 'x的Q-Q图', col = 'blue')
  26. qqline(x)
  27. #绘制P-P图
  28. P <- pnorm(x, mean(x), sd(x))
  29. cdf <- 0
  30. for(i in 1:length(x)){cdf[i] <- sum(x <= x[i])/length(x)}
  31. plot(cdf, P, xlab = '实际分布', ylab = '正态分布',
  32. main = 'x的P-P图', xlim = c(0,1),
  33. ylim = c(0,1), col = 'blue')
  34. abline(a = 0, b = 1)
  35. par(opar)
  36. }
  37. #定量的shapiro检验
  38. if (length(x) <= 5000) {
  39. shapiro <- shapiro.test(x)
  40. if(shapiro$p.value > alpha)
  41. print(paste('定量结果为:', 'x服从正态分布,',
  42. 'P值 =',round(shapiro$p.value,5), '> 0.05'))
  43. else
  44. print(paste('定量结果为:', 'x不服从正态分布,',
  45. 'P值 =',round(shapiro$p.value,5), '<= 0.05'))
  46. shapiro
  47. }
  48. else {
  49. ks <- ks.test(x,'pnorm')
  50. if(ks$p.value > alpha)
  51. print(paste('定量结果为:', 'x服从正态分布,',
  52. 'P值 =',round(ks$p.value,5), '> 0.05'))
  53. else
  54. print(paste('定量结果为:', 'x不服从正态分布,',
  55. 'P值 =',round(ks$p.value,5), '<= 0.05'))
  56. ks
  57. }
  58. }