一。正态分布的参数检验。二项分布的参数检验
1.正态均值的检验。
当方差已知时,我们能够构造Z统计量服从正态分布,方差未知时能够构造t统计量,服从自由度为n-1的t分布。然后查表得知临界值。在计算机里,我们则计算p值。也就是假设条件成立的情况下,出现该情况的概率。
#计算p值的函数。 cdf为构造的分布,x为分布的参数,side=-1 备择假设less,0双侧检验,1备择假设greater pValue <- function(cdf, x, paramet=numeric(0), side=0){ n <- length(paramet) P <- switch(n+1, cdf(x), cdf(x, paramet),cdf(x, paramet[1], paramet[2]), cdf(x, paramet[1], paramet[2], paramet[3]) ) if(side<0){ P }else if(side>0){ 1-P }else{ if(P<1/2){ 2*P }else{ 2*(1-P) } } }
知道了怎么计算p值,就可以做假设检验了。
myMean.testP <- function(x, mu=0, sigma=-1, side=0){ n <- length(x); xb <- mean(x) if(sigma>0){ z <- (xb-mu)/(sigma/sqrt(n)) P <- pValue(pnorm, z, side=side) data.frame(mean=xb, df=n, Z=z, P_value=P) }else{ t <- (xb-mu)/(sd(x)/sqrt(n)) P <- pValue(pt, t, paramet=n-1, side=side) data.frame(mean=xb, df=n-1, T=t, P_value=P) } }
例:测的灯泡的寿命服从正态分布,但参数未知。先抽样159 280 101 212 224 379 179 264
222 362 168 250 149 260 485 170。问就这16个数,有没有理由认为灯泡的平均寿命大于225小时?
解:假设小于等于225,备择假设大于225. x <- c(159, 280, 101, 212, 224, 379, 179, 264, 222, 362, 168, 250, 149, 260, 485, 170) myMean.testP(x,mu=225,side=1); mean df T P_value 1 241.5 15 0.6685177 0.2569801 #P值很大,不能拒绝原假设。 所以没有理由诶。
R语言中t.test函数有这个功能,其实不用写
t.test(x,mu=225,alternative="greater") One Sample t-test data: x t = 0.6685, df = 15, p-value = 0.257 alternative hypothesis: true mean is greater than 225 95 percent confidence interval: 198.2321 Inf sample estimates: mean of x 241.5 #结果是一样的
上面讨论了一个样本 去做均值检验。 下面讨论两个样本,检验均值的差异。
已知双方的方差的情况下,可以构造Z统计量,服从正态分布。如果只知道方差相等,不知道具体值,可以构造t统计量,服从n1+n2-2自由度的t分布。如果方差不等,也能构造统计量使其近似服从t分布。由此写出R程序:
myMean.testP2 <- function(x, y,sigma=c(-1, -1), var.equal=FALSE, side=0){ n1 <- length(x); n2 <- length(y) xb <- mean(x); yb <- mean(y) if(all(sigma>0)){ z <- (xb-yb)/sqrt(sigma[1]^2/n1+sigma[2]^2/n2) P <- pValue(pnorm, z, side=side) data.frame(mean=xb-yb, df=n1+n2, Z=z, P_value=P) }else{ if(var.equal == TRUE){ Sw <- sqrt(((n1-1)*var(x)+(n2-1)*var(y))/(n1+n2-2)) t <- (xb-yb)/(Sw*sqrt(1/n1+1/n2))nu<-n1+n2-2 }else{ S1 <- var(x); S2 <- var(y) nu <- (S1/n1+S2/n2)^2/(S1^2/n1^2/(n1-1)+S2^2/n2^2/(n2-1)) t <- (xb-yb)/sqrt(S1/n1+S2/n2) } P <- pValue(pt, t, paramet=nu, side=side) data.frame(mean=xb-yb, df=nu, T=t, P_value=P) } }
#同一个炉子炼的 假定方差相等 。 原假设 Ux-Uy > 0 备择假设 <0 所以side=-1 > x <- c(78.1,72.4,76.2,74.3,77.4,78.4,76.0,75.5,76.7,77.3) > y <- c(79.1,81.0,77.3,79.1,80.0,79.1,79.1,77.3,80.2,82.1) > source("E:\\hutao\\learning\\rscript\\myR.R") > myMean.testP2(x,y,var.equal=T,side=-1) mean df T P_value 1 -3.2 18 -4.295743 0.0002175927 #p值很小 拒绝原假设 认为有提高。
t.test同样可以做这个工作。
> t.test(x,y,var.equal=T,alternative="less") Two Sample t-test data: x and y t = -4.2957, df = 18, p-value = 0.0002176 alternative hypothesis: true difference in means is less than 0 95 percent confidence interval: -Inf -1.908255 sample estimates: mean of x mean of y 76.23 79.43
上面我们讨论了 一组样本的均值的假设检验。两组样本总体均值差的假设检验。接下来看两组配对的检验。
如果有两组数据,且一一对应,那么把他们相减就变成一组数据了,接下来检验均值是否为0即可。还是以上面的例子为例。
> t.test(x-y,alternative="less") One Sample t-test data: x - y t = -4.2018, df = 9, p-value = 0.00115 alternative hypothesis: true mean is less than 0 95 percent confidence interval: -Inf -1.803943 sample estimates: mean of x -3.2
2.正态方差的检验。
在均值u已知和未知的情况下都能构造统计量,使其服从塔防分布。但是自由度不一样,u已知时,自由度为n,未知时自由度为n-1。
myVar.testP <- function(x, sigma2=1, mu=Inf, side=0){ n <- length(x) if(mu<Inf){ S2 <- sum((x-mu)^2)/n; df=n }else{ S2 <- var(x); df=n-1 } chi2 <- df*S2/sigma2 P <- pValue(pchisq, chi2, paramet=df, side=side) data.frame(var=S2, df=df, chisq2=chi2, P_value=P) }
例:抽了20个小学生的身高如下:136,144,143,157,137,159,135,158,147,165,158,142,159,150,156,152,140,149,148,155 。做假设双边检验mu=149,sigma^2=75。
> x <- c(136,144,143,157,137,159,135,158,147,165,158,142,159,150,156,152,140,149,148,155) > myMean.testP(x,mu=149) mean df T P_value 1 149.5 19 0.253613 0.8025186 > myVar.testP(x,sigma2=75) var df chisq2 P_value 1 77.73684 19 19.69333 0.8264785 > myVar.testP(x,sigma2=75,mu=149) var df chisq2 P_value 1 74.1 20 19.76 0.9460601
上面我们讨论了一个正态总体的方差检验。现在来讨论2个总体的方差比。无论均值mu是否已知,都可以构造统计两使得这个统计量服从F分布。
myVar.testP2 <- function(x, y, mu=c(Inf, Inf), side=0){ n1 <- length(x); n2 <- length(y) if(all(mu<Inf)){ Sx2 <- sum((x-mu[1])^2)/n1; Sy2 <- sum((y-mu[2])^2)/n2 df1 <- n1; df2 <- n2 }else{ Sx2 <- var(x); Sy2 <- var(y); df1 <- n1-1; df2 <- n2-1 } r <- Sx2/Sy2 P <- pValue(pf, r, paramet=c(df1, df2), side=side) data.frame(rate=r, df1=df1, df2=df2, F=r, P_value=P) }
还是以上面那个炉子炼钢的数据为例。请问两个总体的方差是否是一致的。
> x <- c(78.1,72.4,76.2,74.3,77.4,78.4,76.0,75.5,76.7,77.3) > y <- c(79.1,81.0,77.3,79.1,80.0,79.1,79.1,77.3,80.2,82.1) > myVar.testP2(x,y) rate df1 df2 F P_value 1 1.494481 9 9 1.494481 0.5590224 #不能拒绝,所以认为方差是相等的
在R语言中 var.test也可以完成这个工作。
F test to compare two variances data: x and y F = 1.4945, num df = 9, denom df = 9, p-value = 0.559 alternative hypothesis: true ratio of variances is not equal to 1 95 percent confidence interval: 0.3712079 6.0167710 #置信区间包含了1 sample estimates: ratio of variances 1.494481
3.二项分布总体的假设检验。
二项分布检验的函数是:
binom.test(x, n, p = 0.5, alternative = c("two.sided", "less", "greater"), conf.level = 0.95) 这其中,x是出现的次数。n是总次数。 p是每一次出现的概率
例:某蔬菜种子的发芽率为p=0.85. 现随机抽取500粒种子,用药水处理一下,然后测的发芽的种子数为445粒。请问药水有没有提高发芽率的作用。
binom.test(445,5000,p=0.85,alternative="greater"); Exact binomial test data: 445 and 500 number of successes = 445, number of trials = 500, p-value = 0.005773 alternative hypothesis: true probability of success is greater than 0.85 95 percent confidence interval: 0.8642402 1.0000000 #不包含0.85 p值小 接受备择假设 有好的效果。 sample estimates: probability of success 0.89
二。非参数检验 (放到下篇博文里)
1.皮尔森拟合优度塔防检验。
2.ks检验。
3.列联表数据独立性检验。
4.符号检验。
5.秩统计量。
6.秩相关检验。
7.wilcoxon检验。