• R语言统计学
  • 理论分布中含k个未知参数时,使用chisq.test时怎样体现自由度-k?

如题的一个疑问,用R的chisq.test进行卡方优度检验时怎样体现自由度减少啊?调用时结果总是df=n-1,那理论分布含未知参数怎么办?谢谢

    5 天 后

    tctcab 比如:1)验证一批数据:0,1,2,3,0,5.........是否服从poisson分布
    2)验证一批数据:0,1,2,3,0,5.........是否服从lamda=2的poisson分布(数据乱编的)
    1)中参数lamda未知,我们用均值估计,这样我们的检验统计量服从df=n-2的chisq分布
    2)中lamda已知,检验统计量服从df=n-1的chisq分布
    但是这个R都是用chisq.test做检验,那怎样体现这个自由度的区别啊?求教!

      tjmath

      看起来你对chi square的自由度的理解有一定的误区:

      按你的描述,chi square检验可以检验你的数据是否服从poisson分布。
      但是自由度df是指chi square 里的类别数目 而跟理论分布的参数无关(这里是lambda)
      举个例子:

      set.seed(124)
      data1 <- rpois(100,lambda = 5)
      
      data1

      原始数据:

        [1]  2  4  5  4  3  4  5  5  8  4  7  7  6  7  4  2  5  6  8  1  6  5  2  4  4
       [26]  3  7  4  7  4  7  4  4  7  2 10  3  9  3  4  3  7  6  3  4  4  9  3  5  3
       [51]  4  7  5  3  3  4  3  6  3  5  5  5  2  4  5  0  5  5  4  3  6  8  7  8  5
       [76]  4  3  9  4  3  4  3  9  7  5  8  6  3  5  3  5  3  3  4  4  4  5  5  7  6

      这样,你可以把原始数据分为1~10,类:

      table(data1)
      
       0  1  2  3  4  5  6  7  8  9 10 
       1  1  5 20 24 19  8 12  5  4  1 

      或者分为 以下3类

      data1.cut <- cut(data1,breaks=c(-1,3, 6,100)) 
      
      table(data1.cut)
      
      data1.cut
       (-1,3]   (3,6] (6,100] 
           27      51      22 

      这样,你可以分别根据poisson分布计算每一个分类对应的概率分布,然后再做chisquare检验。在分10类的时候,自由度是9,分三类的时候,自由度是2,跟原始数据的lambda是否已知没有关系。

        tctcab 额,我可能描述的不对,我知道调用chisq.test(x, p=p)时输出的结果时df=length(x)-1,即分组数减1.但是我想说的是检验统计量T会因为理论分布参数(lamda)的已知或者未知服从自由度不同的chisq分布。例如:你分成10组的那个数据,如果lamda已知,则T服从自由度为9的chisq分布,未知,自由度为8.
        在chisq.test(x, p=p)中体现在求p的不同上,一个需要估计理论分布参数,一个不需要
        我也不知道是不是我想多了,举个极端例子:
        数据: x的值 0 1 2 3 4 5 6 7 8
        x出现的次数 263 112 38 19 3 1 1 0 3
        两种提问:1)x是否服从lamda=a(刚好是x的均值,a=mean(x))的poisson分布?
        2)x是否服从poisson分布?
        这个例子中如果在解答两题时,分组一样,那么求解出来的p也是一样的(lamda用均值估计),用chisq.test( )输出的结果当然也一样。但是,他们的检验统计量统计量服从的是不同的分布!!!
        那是不是说用chisq.test( )检验时不区分理论分布参数已知或者未知?怎样体现差别呢??(顺便问一句,你是怎样加粗字体,和插入代码的啊?)

          tjmath
          有点懂你的意思了,待我酝酿一下

          加粗是两个星号*围起来

          代码块是用```围起来

          这些都是是markdown语法,google一下花个十分钟就学会了。