【问题标题】:Chi square goodness of fit for random numbers generated生成的随机数的卡方拟合优度
【发布时间】:2014-03-06 12:17:18
【问题描述】:

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

现在要验证这些是否属于它们的相关分布,我必须对拟合优度进行卡方检验。

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

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

    chisq.test(z) #cauchy
    

我收到以下错误:

数据:是的 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)
    

在这种情况下,错误信息:

   Error: could not find function "goodfit"

有人可以指导如何正确实施卡方 GOF 测试吗?

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

edit - 在编写其余代码之前,我确实输入了 library(vcd)。很抱歉假设这是显而易见的。

【问题讨论】:

  • 通常对于卡方检验,您需要“预期频率”,这可能意味着您应该将数据放入适当宽度的箱中(每个箱可能 10 个)。然后你必须比较“观察到的”和“预期的”——换句话说,你需要将概率p 作为chisq 函数中的另一个因素。简单的例子见ww2.coastal.edu/kingw/statistics/R-tutorials/goodness.html
  • 你真的加载过这个包吗?仅使用 install.packages 下载不会加载包。您需要使用library(vcd) 来加载它。

标签: r random statistics simulation


【解决方案1】:

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%,即使它显然是。

您可以使用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))

查看 QQ 图让我更有信心断言 df$ydf$z 分别来自指数分布和柯西分布,而不是 KS 或 ChiSq 检验,即使我不能给出号码就可以了。

【讨论】:

  • +1。对于较大的样本量,K-S 检验往往无法达到显着性,而视觉方法更合适。例如set.seed(6); y = rexp(10); ks.test(y, "pexp")
  • 非常有帮助。我可以听听您对使用以下方法计算中断的意见吗:breaks &lt;- hist(df$y,breaks="Sturges",plot=FALSE)$breaks
【解决方案2】:
# 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

【讨论】:

  • 我确实遵循 1) 和 3) 但是是的,“指数”不存在。那怎么办呢?任何指针?还是分箱只是解决问题的方法?
  • @Raak 如果您使用因子变量(分类), chisq.test 背后的想法是测试这两个(或更多)分类变量之间的独立性或关系。当您处理数字数据时,分箱没有多大意义。
  • @Raaj 阅读 ?chisq.test,详细信息后的第一段。 “如果 x 是一个包含一行或一列的矩阵,或者如果 x 是一个向量并且未给出 y,则执行拟合优度检验(x 被视为一维列联表)。 x 必须是非负整数。在这种情况下,检验的假设是总体概率是否等于 p 中的概率,或者如果没有给出 p,则全部相等。”
  • @Raaj 这可能会有所帮助:stackoverflow.com/questions/11408357/…
  • 好的,根据那个链接,我想我应该使用 set.seed 并从“rexp”中生成 1000 个样本,将其作为预期值存储在一个向量中,然后将它们与我的逆进行比较CDF 值作为观察值。此外,我的“未找到合适的”问题仍然存在。也许我应该更多地谷歌(到目前为止,我遇到的只是错误的函数调用/没有调用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
相关资源
最近更新 更多