如何使用 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 获得 Weibull 分布的置信区间?
你如何计算 Python 中 Pearson's r 的置信区间?
置信区间(Confidence Intervals)是什么?如何计算置信区间?置信区间的两种计算方法是什么?二值样本置信区间如何计算?如何基于bootstrap抽样进行置信区间计算?