R语言 假设检验笔记

一。正态分布的参数检验。二项分布的参数检验
 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)
  }
}

例:
R语言 假设检验笔记_第1张图片

#同一个炉子炼的 假定方差相等 。 原假设 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检验。

你可能感兴趣的:(R语言 假设检验笔记)