如何在BigQuery中执行线性回归?

spr*_*ket 5 google-bigquery

BigQuery有一些统计聚合函数,如STDDEV(X)和CORR(X,Y),但它不提供直接执行线性回归的函数.

如何使用现有的函数计算线性回归?

spr*_*ket 15

以下查询使用数值稳定且易于修改以在任何输入表上工作的计算执行线性回归.它使用内置函数CORR产生最适合模型Y = SLOPE*X + INTERCEPT和Pearson相关系数的斜率和截距.

例如,我们使用公共天性数据集来计算出生体重作为怀孕持续时间的线性函数,按州分列.你可以更紧凑地编写这个,但是我们使用几层子查询来突出这些部分是如何组合在一起的.要将此应用于其他数据集,您只需要替换最里面的查询.

SELECT Bucket,
       SLOPE,
       (SUM_OF_Y - SLOPE * SUM_OF_X) / N AS INTERCEPT,
       CORRELATION
FROM (
    SELECT Bucket,
           N,
           SUM_OF_X,
           SUM_OF_Y,
           CORRELATION * STDDEV_OF_Y / STDDEV_OF_X AS SLOPE,
           CORRELATION
    FROM (
        SELECT Bucket,
               COUNT(*) AS N,
               SUM(X) AS SUM_OF_X,
               SUM(Y) AS SUM_OF_Y,
               STDDEV_POP(X) AS STDDEV_OF_X,
               STDDEV_POP(Y) AS STDDEV_OF_Y,
               CORR(X,Y) AS CORRELATION
        FROM (SELECT state AS Bucket,
                     gestation_weeks AS X,
                     weight_pounds AS Y
              FROM [publicdata.samples.natality])
        WHERE Bucket IS NOT NULL AND
              X IS NOT NULL AND
              Y IS NOT NULL
        GROUP BY Bucket));
Run Code Online (Sandbox Code Playgroud)

使用STDDEV_POP和CORR函数可以提高此查询的数值稳定性,而不是总结X和Y的乘积,然后进行差异和除法,但如果在行为良好的数据集上使用这两种方法,则可以验证它们是否生成相同的结果是高精度.