Google bigquery 如何在BigQuery中模拟线性回归(REGR_)函数?

Google bigquery 如何在BigQuery中模拟线性回归(REGR_)函数?,google-bigquery,Google Bigquery,一些SQL数据库使用一系列名为REGR_SLOPE、REGR_R2、REGR_SXX等函数提供成对值的线性回归。BigQuery用户如何模拟这些函数?编辑器编辑:请参阅--Fh 可以将REGR_u函数转换为包含BigQuery实现的聚合的表达式,但在处理null时应小心谨慎。REGR_u函数采用由一个自变量(我们称之为“x”)和一个因变量“y”组成的对,忽略其中任一变量为NULL的对 下面的查询一次计算所有的REGR_uu表达式。它是用BigQuery标准SQL编写的,并利用用户定义的SQL函

一些SQL数据库使用一系列名为REGR_SLOPE、REGR_R2、REGR_SXX等函数提供成对值的线性回归。BigQuery用户如何模拟这些函数?

编辑器编辑:请参阅--Fh


可以将REGR_u函数转换为包含BigQuery实现的聚合的表达式,但在处理null时应小心谨慎。REGR_u函数采用由一个自变量(我们称之为“x”)和一个因变量“y”组成的对,忽略其中任一变量为NULL的对

下面的查询一次计算所有的REGR_uu表达式。它是用BigQuery标准SQL编写的,并利用用户定义的SQL函数使查询更加简洁。通过测试表达式中的x和y是否为空,此版本将保留键。换句话说,如果某个键的所有对都包含NULL,则结果将为NULL

CREATE TEMPORARY FUNCTION NonNullX(y FLOAT64, x FLOAT64)
RETURNS FLOAT64
AS (IF(x IS NOT NULL AND y IS NOT NULL, x, NULL));

CREATE TEMPORARY FUNCTION NonNullY(y FLOAT64, x FLOAT64)
RETURNS FLOAT64
AS (IF(x IS NOT NULL AND y IS NOT NULL, y, NULL));

CREATE TEMPORARY FUNCTION NonNullCount(y FLOAT64, x FLOAT64)
RETURNS INT64
AS (IF(x IS NOT NULL AND y IS NOT NULL, 1, 0));

CREATE TEMPORARY FUNCTION REGR_R2_COEF(y_var FLOAT64, x_var FLOAT64, xy_corr FLOAT64)
RETURNS FLOAT64
AS (IF(x_var = 0, NULL, IF(y_var = 0 AND x_var <> 0, 1, POWER(xy_corr, 2))));

SELECT k, 
       AVG(NonNullX(y, x)) AS REGR_AVGX,
       AVG(NonNullY(y, x)) AS REGR_AVGY,
       SUM(NonNullCount(y, x)) AS REGR_COUNT,
       AVG(NonNullY(y, x))-(COVAR_POP(NonNullY(y, x), NonNullX(y, x))/VAR_POP(NonNullX(y, x)))*AVG(NonNullX(y, x)) AS REGR_INTERCEPT,
       REGR_R2_COEF(VAR_POP(NonNullY(y, x)), VAR_POP(NonNullX(y, x)), CORR(NonNullY(y, x), NonNullX(y, x))) AS REGR_R2,
       COVAR_POP(NonNullY(y, x), NonNullX(y, x))/VAR_POP(NonNullX(y, x)) AS REGR_SLOPE,
       SUM(NonNullCount(y, x)) * VAR_POP(NonNullX(y, x)) AS REGR_SXX,
       SUM(NonNullCount(y, x)) * COVAR_POP(NonNullY(y, x), NonNullX(y, x)) AS REGR_SXY,
       SUM(NonNullCount(y, x)) * VAR_POP(NonNullY(y, x)) AS REGR_SYY
FROM Temp.SimpleRegressionData
GROUP BY k;
创建临时函数NonNullX(y FLOAT64,x FLOAT64)
返回浮点64
AS(如果(x不为NULL,y不为NULL,x,NULL));
创建临时函数非空(y浮点64,x浮点64)
返回浮点64
AS(如果(x不为NULL,y不为NULL,y,NULL));
创建临时函数NonNullCount(y FLOAT64,x FLOAT64)
返回INT64
AS(如果(x不为NULL,y不为NULL,1,0));
创建临时函数REGR_R2_COEF(y_var FLOAT64,x_var FLOAT64,xy_corr FLOAT64)
返回浮点64
AS(IF(x_-var=0,NULL,IF(y_-var=0,x_-var=0,1,幂(xy_-corr,2)));
选择k,
平均值(非空值x(y,x))作为平均值,
平均值(非空值(y,x))作为平均值,
和(非空计数(y,x))作为再计数,
AVG(NonNullY(y,x))-(covaru_POP(NonNullY(y,x),NonNullX(y,x))/VAR_POP(NonNullX(y,x))*AVG(NonNullX(y,x))作为重截距,
将R2_COEF(VAR_POP(NonNullY(y,x))、VAR_POP(NonNullX(y,x))、CORR(NonNullY(y,x)、NonNullX(y,x))作为R2,
COVAR_POP(非空(y,x),非空x(y,x))/VAR_POP(非空x(y,x))作为再斜率,
求和(非空计数(y,x))*VAR_POP(非空x(y,x))作为REGR_SXX,
求和(非空计数(y,x))*COVAR_POP(非空(y,x),非空x(y,x))作为再计算,
求和(非空计数(y,x))*VAR_POP(非空计数(y,x))作为重新计算
从Temp.SimpleRegressionData
k组;
如果您不在乎有空结果,您可以过滤掉WHERE子句中包含空值的对,聚合表达式将简化如下:

CREATE TEMPORARY FUNCTION REGR_R2_COEF(y_var FLOAT64, x_var FLOAT64, xy_corr FLOAT64)
RETURNS FLOAT64
AS (IF(x_var = 0, NULL, IF(y_var = 0 AND x_var <> 0, 1, POWER(xy_corr, 2))));

SELECT k, 
       AVG(x) AS REGR_AVGX,
       AVG(y) AS REGR_AVGY,
       SUM(1) AS REGR_COUNT,
       AVG(y)-(COVAR_POP(y, x)/VAR_POP(x))*AVG(x) AS REGR_INTERCEPT,
       REGR_R2_COEF(VAR_POP(y), VAR_POP(x), CORR(y, x)) AS REGR_R2,
       COVAR_POP(y, x)/VAR_POP(x) AS REGR_SLOPE,
       SUM(1) * VAR_POP(x) AS REGR_SXX,
       SUM(1) * COVAR_POP(y, x) AS REGR_SXY,
       SUM(1) * VAR_POP(y) AS REGR_SYY
FROM Temp.SimpleRegressionData
WHERE x IS NOT NULL AND Y IS NOT NULL
GROUP BY k;
创建临时函数REGR_R2_COEF(y_var FLOAT64,x_var FLOAT64,xy_corr FLOAT64)
返回浮点64
AS(IF(x_-var=0,NULL,IF(y_-var=0,x_-var=0,1,幂(xy_-corr,2)));
选择k,
平均值(x)为平均值,
平均值(y)为平均值,
总计(1)作为重新计数,
平均值(y)-(COVAR_POP(y,x)/VAR_POP(x))*平均值(x)作为再生截距,
作为再融资R2的再融资成本(VAR_POP(y),VAR_POP(x),CORR(y,x)),
COVAR_POP(y,x)/VAR_POP(x)作为再生斜率,
总和(1)*VAR_POP(x)作为Rer_SXX,
总和(1)*COVAR_POP(y,x)作为再融资,
总和(1)*增值(y)作为再融资
从Temp.SimpleRegressionData
其中x不为NULL,Y不为NULL
k组;
请注意,如果某个键的所有非空x值相等,则这些查询中的任何一个都可能给出一个被零除的错误