智方形适合随机数生成

时间:2014-02-09 05:21:18

标签: r random statistics simulation

我使用逆向CDF方法从指数 a Cauchy 随机变量生成1000个样本。

现在要验证这些是否属于他们的相关分布,我必须进行适合度的Chi-Squared测试。

我尝试了两种方法(如下所示) -

  1. Chisq.test(y)#which有1000个来自假定指数分布的样本

    chisq.test(z) #cauchy
    
  2. 我收到以下错误:

      

    数据:y   X平方= 234.0518,df = 999,p值= 1

     Warning message:
     In chisq.test(y) : Chi-squared approximation may be incorrect
      chisq.test(z)
     Error in chisq.test(z) : 
      all entries of 'x' must be nonnegative and finite 
    
    1. 我下载 vcd 库以使用 goodfit() 并输入:

          t1 <- goodfit(y,type= "exponential",method= "MinChiSq")
          summary(t1)
      
    2. 在这种情况下,错误消息:

         Error: could not find function "goodfit"
      

      有人可以指导如何正确实施Chi-Squared GOF测试吗?

      注意:样本不是正态分布(分别为指数和焦点) 我试图了解是否有可能获得观察到的和预期的数据,而不是到目前为止没有运气。

      编辑 - 我在写完其余代码之前输入了 library(vcd)。道歉已经明白了。

2 个答案:

答案 0 :(得分:4)

chisq.test(...)函数主要用于计数,因此它期望其参数可数(例如使用table(...)),或者已经计数。它基本上为xy(前两个参数)创建一个列联表,然后使用chisq测试来确定它们是否来自同一个分布。

你可能最好使用Kolmogorov-Smirnov测试,它专为像你这样的问题而设计。 K-S测试将样本的ecdf与测试分布的cdf进行比较,并测试零假设它们是否相同。

set.seed(1)
df <- data.frame(y = rexp(1000),
                 z = rcauchy(1000, 100, 100))

ks.test(df$y,"pexp")
# One-sample Kolmogorov-Smirnov test
#
# data:  df$y
# D = 0.0387, p-value = 0.1001
# alternative hypothesis: two-sided

ks.test(df$z,"pcauchy",100,100)    
#  One-sample Kolmogorov-Smirnov test
# 
# data:  df$z
# D = 0.0296, p-value = 0.3455
# alternative hypothesis: two-sided

请注意,在这种情况下,K-S测试预测样本df$y 的概率为90%的概率来自指数分布,即使它显然也是如此。

您可以通过人工对数据进行分类,然后将每个bin中的计数与测试分布中的预期值进行比较(使用chisq.test(...))来使用p=...,但这是错综复杂的,并且您可以回答取决于垃圾箱的数量。

breaks <- c(seq(0,10,by=1))
O <- table(cut(df$y,breaks=breaks))
p <- diff(pexp(breaks))
chisq.test(O,p=p, rescale.p=T)
#   Chi-squared test for given probabilities
# 
# data:  O
# X-squared = 7.9911, df = 9, p-value = 0.535

在这种情况下,chisq测试预测样本的概率为47%,是指数分布。

最后,即使它们是定性的,我发现Q-Q图非常有用。这些将样本的分位数与测试分布的分位数进行对比。如果从测试分布中抽取样本,则Q-Q图应该接近y=x行。

par(mfrow=c(1,2))
plot(qexp(seq(0,1,0.01)),quantile(df$y,seq(0,1,0.01)),
     main="Q-Q Plot",ylab="df$Y", xlab="Exponential",
     xlim=c(0,5),ylim=c(0,5))
plot(qcauchy(seq(0,.99,0.01),100,100),quantile(df$z,seq(0,.99,0.01)),
     main="Q-Q Plot",ylab="df$Z",xlab="Cauchy",
     xlim=c(-1000,1000),ylim=c(-1000,1000))

enter image description here

查看QQ图表让我更有信心断言df$ydf$z分别来自指数和Cauchy分布,而不是KS或ChiSq测试,尽管我可以不要在上面写上数字。

答案 1 :(得分:0)

# Simulation

set.seed(123)
df <- data.frame(y = rexp(1000),
                 z = rcauchy(1000, 100, 100)
                 )

#This seems to be different, probably because of how you are simulating the data
chisq.test(df$y)

#   Chi-squared test for given probabilities
#
# data:  df$y
# X-squared = 978.485, df = 999, p-value = 0.6726
#
# Warning message:
# In chisq.test(df$y) : Chi-squared approximation may be incorrect

3详细信息:

1) you need to load the package. library(vcd)
2) There is no "exponential" type of distribution in the goodfit function
3) the method is MinChisq, Not MinChiSq

library(vcd)
t1 <- goodfit(df$y, type= "binomial", method= "MinChisq")
summary(t1)

#        Goodness-of-fit test for binomial distribution
#    
#                 X^2 df     P(> X^2)
#    Pearson 31.00952  6 2.524337e-05
#    Warning message:
#    In summary.goodfit(t1) : Chi-squared approximation may be incorrect