R 几何分布的卡方拟合优度

R 几何分布的卡方拟合优度,r,statistics,chi-squared,R,Statistics,Chi Squared,作为一项任务,我必须为给定的几何分布和PMF开发算法并生成样本 使用逆变换方法,我得出了以下用于生成值的表达式: 式中,U表示从Unif(0,1)分布中提取的一个值,或n个值,取决于样品的大小,p为0.3,如上述PMF中所述 我有算法,在R中实现,我已经生成了QQ图,以直观地评估经验值对理论值的调整(用R生成),即,如果生成的样本确实遵循几何分布 现在,我想将生成的样本提交到拟合优度测试,即卡方检验,但在R中执行此操作时遇到困难。让我们假设您在向量x中获得了随机生成的变量。您可以执行以下操作

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

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

式中,U表示从Unif(0,1)分布中提取的一个值,或n个值,取决于样品的大小,p为0.3,如上述PMF中所述

我有算法,在R中实现,我已经生成了QQ图,以直观地评估经验值对理论值的调整(用R生成),即,如果生成的样本确实遵循几何分布


现在,我想将生成的样本提交到拟合优度测试,即卡方检验,但在R中执行此操作时遇到困难。

让我们假设您在向量
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)

x让我们假设你在向量
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)

x[尽管您对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
 (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 
警告,
dgeom
和friends从x=0开始,而不是x=1;虽然可以将输入和输出转换为R函数,但如果从所有几何值中减去1并进行测试,则更容易。我将继续,就好像你的样本从0减去1一样

我将在第15个术语(x=14)处将其截断,并将15+分组为它自己的组(在本例中为单个组)。如果你想遵循“大于5”的经验法则,你可以在第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
现在,未指定p的情况类似,但是(据我所知)你不能再直接得到
chisq.test
,你必须用第一种方法,但你必须从数据中估计参数(通过最大似然或最小卡方),然后按照上面的方法进行测试,但估计参数的自由度减少了一个


请参见使用估计参数对泊松进行卡方检验的示例;几何图形采用与上述方法大致相同的方法,在链接处进行调整(处理未知参数,包括失去1个自由度)。

[我认为这一点有点仓促,尽管你回答了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
 (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 
警告,
dgeom
和friends从x=0开始,而不是从x=1开始;虽然您可以将输入和输出转换为R函数,但如果您从所有几何值中减去1并进行测试,会更容易。我将继续,就像您的示例从0减去1一样

我将在第15学期(x=14)时将其截断,并将15+分组到它自己的组中(在本例中为单个组)。如果你想遵循“大于5”的经验法则,你应该将其截断
G.fit <- goodfit(x, type = "nbinomial", par = list(size = 1))
sim.geometric <- function(nvals)
{
    p <- 0.3
    u <- runif(nvals)
    ceiling(log(u)/log(1-p))
}
png("QQ.png")
qqplot(qgeom(ppoints(100),prob=0.3), sim.res,
       main = expression("Q-Q plot for" ~~ {G}[n == 100]))
dev.off()
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")