卡方检验两个变量是否具有相同的频率分布

机器算法验证 r 分布 正态分布 卡方检验 频率
2022-04-10 00:46:27

我想使用卡方测试是否x具有y相同的频率分布。在下面的代码中,我得出的结论是,因为卡方的 P 值 > 0.05,所以我没有发现证据表明存在不同xy频率分布。我的结论正确吗?

set.seed(1)

x <- rnorm(100, 3, 2)
y <- rnorm(100, 3, 2)

x_counts <- with(hist(x, plot = FALSE), data.frame(breaks = breaks[-1], counts = counts))
y_counts <- with(hist(y, plot = FALSE), data.frame(breaks = breaks[-1], counts = counts))

y_counts <- rbind(data.frame(breaks = -1, counts = 0), y_counts)

x_probs <- x_counts$counts/sum(x_counts$counts)

chisq.test(x=y_counts$counts, p=c(x_probs), simulate.p.value = TRUE)

#   Chi-squared test for given probabilities with simulated p-value (based on 2000 replicates)

# data:  y_counts$counts
# X-squared = 3.3808e-31, df = NA, p-value = 1
2个回答

很明显,您的实验出了点问题。具体来说,问题很可能是您生成的两个分布的支持不一样,因此,您从卡方检验中得到了一个非常奇怪的结果。另一个问题是卡方检验旨在将分布与一组未知的频率进行比较,当比较两个分布时,由于的频率估计而导致的可变性未被考虑在内。X

一般来说,只要你得到 NA 的自由度和 1 的 p 值,你就应该很确定出了问题。

如果您的两个随机变量确实是连续的,那么评论中提出的测试(Kolmogorov-Smirnoff 等......)是最好的。如果感兴趣的分布是离散的,那么广义似然比检验可能效果很好。假设我们观察到两个随机变量,每个变量取值。表示从观察到的类型的观察次数表示从的观察次数,用表示观察的总数。然后似然比统计量由下式给出: pxii{1,...,p}ixyiiynxny

2logi=1p(xinx)xi(yiny)yii=1p(yi+xiny+nx)yi+xiχp12.

该检验统计量实质上比较了假设两个不同分布的模型与假设两组观测值的单一分布的模型的拟合。建议的测试在以下代码中实现:

discreteLR <- function(x, y, exact = FALSE) {
  if(length(x) != length(y)) stop("Length of x and y must be equal!")

  nx <- sum(x)
  ny <- sum(y)

  loglikX <- sum(x * log(x / nx))
  loglikY <- sum(y * log(y / ny))
  joint <- sum((y + x) * log((y + x)/ (nx + ny)))

  chisq <- 2 * (loglikX + loglikY - joint)
  pval <- pchisq(chisq, length(x) - 1, lower.tail = FALSE)

  return(c(chisqStat = chisq, pval = pval))
}

set.seed(1)
p <- runif(5)
p <- p / sum(p)
nx <- 100
ny <- 150
reps <- 10^3
x <- rmultinom(reps, nx, p)
y <- rmultinom(reps, ny, p)

pvalues <- numeric(reps)
exact <- numeric(reps)
for(i in 1:reps) {
  pvalues[i] <- discreteLR(x[, i], y[, i])[2]
}

qqplot(qunif(ppoints(reps)), pvalues,
       xlab = "uniform quantiles",
       ylab = "simulated p-values")
abline(a = 0, b = 1)

在此处输入图像描述

我不精通R。

我会说答案是肯定的,H0 是两个分布相等,这就是你命令中的 x=y 的意思,对吧?然后 p-value = 1 当然,你没有拒绝 H0