如何使用 BigQuery 找到置信区间?

Posted

技术标签:

【中文标题】如何使用 BigQuery 找到置信区间?【英文标题】:How can I find confidence intervals using BigQuery? 【发布时间】:2020-10-05 14:32:33 【问题描述】:

我有两个 javascript 函数来通过二项式检验计算置信区间。当我将它作为任何 js 代码运行时,两者都运行良好。 当我将它集成到查询第二个函数(查找上置信区间)中时,返回NaN。我不明白为什么它在 BigQuery 中不起作用。

CREATE TEMP FUNCTION findConfidenceIntervalFloor(C INT64, L INT64, p FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
  function binomial_test(k, n, p)
    if(k < 0 || k > n || n <= 0 || p < 0 || p > 1) return NaN;
    // i = 0 term
    var logcoef = 0;
    var pvalue = Math.pow(Math.E, n*Math.log(1-p)); // Math.exp is not available
    // i > 0 terms
    for(var i = 1; i <= k; i++) 
      logcoef = logcoef + Math.log(n-i+1) - Math.log(i);
      pvalue = pvalue + Math.pow(Math.E, logcoef + i*Math.log(p) + (n-i)*Math.log(1-p));
    
    return pvalue;
  
  let CR = L/C
    let x1 = 0
    let x2 = L   
    while ((x2 - x1) > 1)        
        let x = Math.ceil((x2 - x1) / 2 + x1)
        
        if (binomial_test(x, C, CR) < p/2) 
            x1 = x
         else 
            x2 = x
        
        
    
    return x2;
  """;

CREATE TEMP FUNCTION findConfidenceIntervalCeil(C INT64, L INT64, p FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
  function binomial_test(k, n, p)
    if(k < 0 || k > n || n <= 0 || p < 0 || p > 1) return NaN;
    var logcoef = 0;
    var pvalue = Math.pow(Math.E, n*Math.log(1-p)); 
    for(var i = 1; i <= k; i++) 
      logcoef = logcoef + Math.log(n-i+1) - Math.log(i);
      pvalue = pvalue + Math.pow(Math.E, logcoef + i*Math.log(p) + (n-i)*Math.log(1-p));
    
    return pvalue;
  
  let CR = L/C;
    let x1 = L;
    let x2 = C;  
    while ((x2 - x1) > 1)        
        let x = Math.ceil((x2 - x1) / 2 + x1);
        
        if (binomial_test(x, C, CR) < (1 - p/2)) 
            x1 = x;
         else 
            x2 = x;
                
    
    return x1;
  """;
WITH t0 as (SELECT 'site1' as name, 97000 as clicks, 3784 as leads
UNION ALL
SELECT 'site2', 68099, 2342)
  
select *, 
findConfidenceIntervalFloor(clicks, leads, 0.005) as bot_interval_del,
findConfidenceIntervalCeil(clicks, leads, 0.005) as top_interval_del,
findConfidenceIntervalFloor(clicks, leads, 0.05) as bot_interval_add,
findConfidenceIntervalCeil(clicks, leads, 0.05) as top_interval_add
from t0

现在我使用除以 2 的 brutforce。我认为这不是计算它的最佳方法,所以关于如何改进它并至少使其适用于 BigQuery 的任何建议。

【问题讨论】:

【参考方案1】:

当我将它集成到查询第二个函数(查找上置信区间)中时,返回 NaN。 我不明白为什么它在 BigQuery 中不起作用。

我认为您应该只修复函数的签名以使用 FLOAT64 而不是 INT64,如下所示

CREATE TEMP FUNCTION findConfidenceIntervalFloor(C FLOAT64, L FLOAT64, p FLOAT64)    

CREATE TEMP FUNCTION findConfidenceIntervalCeil(C FLOAT64, L FLOAT64, p FLOAT64)  

如果你这样做 - 你会得到输出

Row name    clicks  leads   bot_interval_del    top_interval_del    bot_interval_add    top_interval_add     
1   site1   97000   3784    3616.0              3953.0              3666.0              3902.0   
2   site2   68099   2342    2210.0              2476.0              2249.0              2435.0     

详情请见Supported JavaScript UDF data types

【讨论】:

以上是关于如何使用 BigQuery 找到置信区间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中绘制置信区间?

如何使用 Python 获得 Weibull 分布的置信区间?

你如何计算 Python 中 Pearson's r 的置信区间?

谨慎看待统计中的P值、置信区间和统计功效

置信区间(Confidence Intervals)是什么?如何计算置信区间?置信区间的两种计算方法是什么?二值样本置信区间如何计算?如何基于bootstrap抽样进行置信区间计算?

如何使用 Python 计算差异差异方法的置信区间?