Chi为几何分布拟合优度

时间:2013-12-03 16:18:53

标签: r statistics chi-squared

作为一项任务,我必须开发和算法,并使用PMF生成给定几何分布的样本

enter image description here

使用逆变换方法,我想出了以下用于生成值的表达式:

enter image description here

其中U表示一个值,或者n值取决于样本的大小,从Unif(0,1)分布中得出,p是0.3,如上面的PMF中所述。

我有算法,R和I中的实现已经生成了QQ图,可以直观地评估经验值对理论值的调整(用R生成),即生成的样本是否遵循几何分布。 / p>

现在我想将生成的样本提交给拟合优度测试,即卡方,但是我在R中做到这一点时遇到了麻烦。

3 个答案:

答案 0 :(得分:2)

[我认为这有点仓促,尽管你回答了whuber的问题,因为我认为在解决'如何在R中编写这个算法'问题之前,处理'什么可能更重要'你正在做的不是解决问题的最佳方法(这当然属于你发布的问题)。既然它在这里,我将处理'在R中做它'的方面,但我会敦促你回去询问第二个问题(作为一个新帖子)。]

首先,卡方检验有点不同,取决于你是否测试

H0:数据来自具有参数 p

的几何分布

H0:数据来自几何分布,参数为0.3

如果你想要第二个,那就非常简单了。首先,对于几何,如果要使用卡方近似检验统计量的分布,则需要对尾部的相邻单元格进行分组。 “通常”规则 - 过于保守 - 表明您需要在每个至少为5的箱子中预期计数。

我假设你的样本量很大。在这种情况下,你将拥有许多具有大量预期数量的垃圾箱,你不需要太担心如何保持这么高,但是你仍然需要选择如何收尾(无论你只选择一个例如,所有值都被分组的截止值。

我会继续,好像n说1000(虽然如果你正在测试你的几何随机数生成,那就相当低了。)

首先,计算您的预期计数:

 dgeom(0:20,.3)*1000
 [1] 300.0000000 210.0000000 147.0000000 102.9000000  72.0300000  50.4210000
 [7]  35.2947000  24.7062900  17.2944030  12.1060821   8.4742575   5.9319802
[13]   4.1523862   2.9066703   2.0346692   1.4242685   0.9969879   0.6978915
[19]   0.4885241   0.3419669   0.2393768

警告,dgeom和朋友从x = 0开始,而不是x = 1;虽然您可以将输入和输出移动到R函数,但如果从所有几何值中减去1并进行测试,则会更容易。我将继续进行,就好像你的样本已减去1,以便它从0开始。

我会在第15个学期(x = 14)和15+组进入自己的小组(在这种情况下是一个小组)。如果你想遵循'超过五个'的经验法则,那么你将在第12个学期(x = 11)之后将其剪掉。在某些情况下(例如较小的p),您可能希望将尾部分成几个箱而不是一个箱。

> expec <- dgeom(0:14,.3)*1000
> expec <- c(expec, 1000-sum(expec))
> expec
 [1] 300.000000 210.000000 147.000000 102.900000  72.030000  50.421000
 [7]  35.294700  24.706290  17.294403  12.106082   8.474257   5.931980
[13]   4.152386   2.906670   2.034669   4.747562

最后一个单元格是“15+”​​类别。我们还需要概率。

现在我们还没有样品;我只会生成一个:

y <- rgeom(1000,0.3)

但现在我们想要一个观察计数表:

 (x <- table(factor(y,levels=0:14),exclude=NULL))

   0    1    2    3    4    5    6    7    8    9   10   11   12   13   14 <NA> 
 292  203  150   96   79   59   47   25   16   10    6    7    0    2    5    3 

现在你可以直接计算卡方,然后计算p值:

> (chisqstat <- sum((x-expec)^2/expec))
[1] 17.76835
(pval <- pchisq(chisqstat,15,lower.tail=FALSE))
[1] 0.2750401

但你也可以让R去做:

> chisq.test(x,p=expec/1000)

        Chi-squared test for given probabilities

data:  x 
X-squared = 17.7683, df = 15, p-value = 0.275

Warning message:
In chisq.test(x, p = expec/1000) :
  Chi-squared approximation may be incorrect

现在未指定p的情况类似,但(据我所知)你不能再让chisq.test直接进行,你必须先做第一种方法,但你必须估计参数来自数据(通过最大似然或最小卡方),然后按上述方法进行测试,但估算参数的自由度较小。

参见使用估计参数here对泊松进行卡方的示例;几何遵循与上面相同的方法,在链接处进行调整(处理未知参数,包括失去1个自由度)。

答案 1 :(得分:1)

让我们假设您已经在向量x中获得了随机生成的变量。您可以执行以下操作:

x <- rgeom(1000,0.2)

x_tbl <- table(x)
x_val <- as.numeric(names(x_tbl))
x_df <- data.frame(count=as.numeric(x_tbl), value=x_val)

# Expand to fill in "gaps" in the values caused by 0 counts
all_x_val <- data.frame(value = 0:max(x_val))
x_df <- merge(all_x_val, x_df, by="value", all.x=TRUE)
x_df$count[is.na(x_df$count)] <- 0

# Get theoretical probabilities 
x_df$eprob <- dgeom(x_df$val, 0.2)

# Chi-square test: once with asymptotic dist'n, 
# once with bootstrap evaluation of chi-sq test statistic
chisq.test(x=x_df$count, p=x_df$eprob, rescale.p=TRUE)
chisq.test(x=x_df$count, p=x_df$eprob, rescale.p=TRUE, 
   simulate.p.value=TRUE, B=10000)

答案 2 :(得分:1)

“vcd”软件包中有一个“goodfit”函数描述为“离散数据的优度测试”。

G.fit <- goodfit(x, type = "nbinomial", par = list(size = 1))

我打算使用您在之前的问题中发布的代码,但现在看来您已经删除了该代码。我觉得这很冒犯。您是否正在使用此论坛收集作业答案,然后对其进行修改以删除证据? (我们这些有足够代表的人仍然可以看到已删除的问题,并且界面可以防止删除问题,因此您不应该删除此问题。)

Generate a QQ Plot for testing a geometrically distributed sample

---问题---

我在R中使用

生成了n个元素的样本
sim.geometric <- function(nvals)
{
    p <- 0.3
    u <- runif(nvals)
    ceiling(log(u)/log(1-p))
}

我想测试它的分布,特别是如果它确实遵循几何分布。我想生成一个QQ PLOT,但不知道如何。

--------转发答案----------

与从具有相同概率参数的几何分布绘制的“真实”样本相比,QQ图应该是直线。一个给出函数的两个向量,它们基本上比较了它们在每个分位数处的逆ECDF。 (你的尝试并不是特别成功:)

sim.res&lt; - sim.geometric(100) sim.rgeom&lt; - rgeom(100,0.3) qqplot(sim.res,sim.rgeom)

在这里,我跟随qqplot帮助页面作者的主角(导致翻转身份线周围的上方曲线):

png("QQ.png")
qqplot(qgeom(ppoints(100),prob=0.3), sim.res,
       main = expression("Q-Q plot for" ~~ {G}[n == 100]))
dev.off()

---图片不包括---

您可以通过绘制每条分布的第25和第75百分位数的线来添加“良好拟合线”。 (我为此添加了一个抖动功能,以便更好地了解“概率质量”所在的位置:)

sim.res <- sim.geometric(500)
qqplot(jitter(qgeom(ppoints(500),prob=0.3)), jitter(sim.res),
       main = expression("Q-Q plot for" ~~ {G}[n == 100]), ylim=c(0,max( qgeom(ppoints(500),prob=0.3),sim.res )),
xlim=c(0,max( qgeom(ppoints(500),prob=0.3),sim.res )))
 qqline(sim.res, distribution = function(p) qgeom(p, 0.3),
       prob = c(0.25, 0.75), col = "red")