我使用逆向CDF方法从指数和 a Cauchy 随机变量生成1000个样本。
现在要验证这些是否属于他们的相关分布,我必须进行适合度的Chi-Squared测试。
我尝试了两种方法(如下所示) -
Chisq.test(y)#which有1000个来自假定指数分布的样本
chisq.test(z) #cauchy
我收到以下错误:
数据: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
我下载 vcd 库以使用 goodfit() 并输入:
t1 <- goodfit(y,type= "exponential",method= "MinChiSq")
summary(t1)
在这种情况下,错误消息:
Error: could not find function "goodfit"
有人可以指导如何正确实施Chi-Squared GOF测试吗?
注意:样本不是正态分布(分别为指数和焦点) 我试图了解是否有可能获得观察到的和预期的数据,而不是到目前为止没有运气。
编辑 - 我在写完其余代码之前输入了 library(vcd)。道歉已经明白了。
答案 0 :(得分:4)
chisq.test(...)
函数主要用于计数,因此它期望其参数可数(例如使用table(...)
),或者已经计数。它基本上为x
和y
(前两个参数)创建一个列联表,然后使用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))
查看QQ图表让我更有信心断言df$y
和df$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