根据 QQ 图中的均匀分布计算通货膨胀观察到的和预期的 p 值

机器算法验证 可能性 分布 QQ图
2022-03-22 09:37:28

我正在尝试量化通货膨胀程度(即观察到的数据点与预期的最佳拟合程度)。一种方法是太看QQ情节。但我想计算一些通货膨胀的数字指标 - 意味着观察到的符合理论均匀分布的程度。

在此处输入图像描述

示例数据:

# random uniform distribution 
pvalue <- runif(100, min=0, max=1)
# with inflation expected i.e. not uniform distribution  
pvalue1 <- rnorm(100, mean = 0.5, sd=0.1)
1个回答

我们可以通过不同的方式测试与任何分布的偏差(在您的情况下是均匀的):

(1) 非参数检验:

您可以使用Kolmogorov-Smirnov检验来查看符合预期的观测值分布。

R 具有ks.test可以执行 Kolmogorov-Smirnov 检验的功能。

pvalue <- runif(100, min=0, max=1)
ks.test(pvalue, "punif", 0, 1) 

        One-sample Kolmogorov-Smirnov test

data:  pvalue
D = 0.0647, p-value = 0.7974
alternative hypothesis: two-sided

pvalue1 <- rnorm (100, 0.5, 0.1)
ks.test(pvalue1, "punif", 0, 1) 
        One-sample Kolmogorov-Smirnov test

data:  pvalue1
D = 0.2861, p-value = 1.548e-07
alternative hypothesis: two-sided

(2)卡方拟合优度检验

在这种情况下,我们对数据进行分类。我们注意到每个单元格或类别中观察到的和预期的频率。对于连续情况,可以通过创建人为间隔(箱)对数据进行分类。

   # example 1
    pvalue <- runif(100, min=0, max=1)
    tb.pvalue <- table (cut(pvalue,breaks= seq(0,1,0.1)))
    chisq.test(tb.pvalue, p=rep(0.1, 10))

        Chi-squared test for given probabilities

data:  tb.pvalue
X-squared = 6.4, df = 9, p-value = 0.6993

# example 2
    pvalue1 <- rnorm (100, 0.5, 0.1)
tb.pvalue1 <- table (cut(pvalue1,breaks= seq(0,1,0.1)))
chisq.test(tb.pvalue1, p=rep(0.1, 10))
            Chi-squared test for given probabilities

data:  tb.pvalue1
X-squared = 162, df = 9, p-value < 2.2e-16

(3) 拉姆达

如果您正在进行全基因组关联研究 (GWAS),您可能需要计算基因组膨胀因子,也称为 lambda(λ)(另请参阅)。该统计数据在统计遗传学界很受欢迎。根据定义,λ 定义为所得卡方检验统计量的中位数除以卡方分布的预期中位数。具有一个自由度的卡方分布的中位数为 0.4549364。λ 值可以通过 z 分数、卡方统计量或 p 值计算,具体取决于关联分析的输出。有时会丢弃来自上尾的 p 值比例。

对于 p 值,您可以通过以下方式执行此操作:

set.seed(1234)
pvalue <- runif(1000, min=0, max=1)
chisq <- qchisq(1-pvalue,1)


# For z-scores as association, just square them
    # chisq <- data$z^2
        #For chi-squared values, keep as is
        #chisq <- data$chisq
    lambda = median(chisq)/qchisq(0.5,1)
    lambda 
    [1] 0.9532617

     set.seed(1121)
    pvalue1 <- rnorm (1000, 0.4, 0.1)
    chisq1 <- qchisq(1-pvalue1,1)
    lambda1 = median(chisq1)/qchisq(0.5,1)
    lambda1
    [1] 1.567119

如果分析结果您的数据遵循正态卡方分布(无膨胀),则预期 λ 值为 1。如果 λ 值大于 1,则这可能是一些需要在分析中纠正的系统偏差的证据.

也可以使用回归分析来估计 Lambda。

   set.seed(1234)
      pvalue <- runif(1000, min=0, max=1)
    data <- qchisq(pvalue, 1, lower.tail = FALSE)
   data <- sort(data)
   ppoi <- ppoints(data) #Generates the sequence of probability points
   ppoi <- sort(qchisq(ppoi, df = 1, lower.tail = FALSE))
   out <- list()
   s <- summary(lm(data ~ 0 + ppoi))$coeff
       out$estimate <- s[1, 1] # lambda 
   out$se <- s[1, 2]
       # median method
        out$estimate <- median(data, na.rm = TRUE)/qchisq(0.5, 1)

另一种计算 lambda 的方法是使用“KS”(通过使用 Kolmogorov-Smirnov 检验优化 chi2.1df 分布拟合)。