作为一项任务,我必须开发和算法,并使用PMF生成给定几何分布的样本
使用逆变换方法,我想出了以下用于生成值的表达式:
其中U表示一个值,或者n值取决于样本的大小,从Unif(0,1)分布中得出,p是0.3,如上面的PMF中所述。
我有算法,R和I中的实现已经生成了QQ图,可以直观地评估经验值对理论值的调整(用R生成),即生成的样本是否遵循几何分布。 / p>
现在我想将生成的样本提交给拟合优度测试,即卡方,但是我在R中做到这一点时遇到了麻烦。
答案 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")