blob: 485aaf6d033025e1bc70b1152f606cc33bcd14fe [file] [log] [blame]
--
-- leastsquares.sql - test for ordinary least squares regression aggregates:
-- * regr_count
-- * regr_avgx
-- * regr_avgy
-- * regr_sxx
-- * regr_sxy
-- * regr_syy
-- * regr_intercept
-- * regr_slope
-- * regr_r2
CREATE TABLE weibull
(
id INTEGER NOT NULL,
x1 DOUBLE PRECISION,
x2 DOUBLE PRECISION,
y DOUBLE PRECISION
) DISTRIBUTED BY (id);
COPY weibull (id, x1, x2, y) FROM stdin;
1 41.9 29.1 251.3
2 43.4 29.3 251.3
3 43.9 29.5 248.3
4 44.5 29.7 267.5
5 47.3 29.9 273.0
6 47.5 30.3 276.5
7 47.9 30.5 270.3
8 50.2 30.7 274.9
9 52.8 30.8 285.0
10 53.2 30.9 290.0
11 56.7 31.5 297.0
12 57.0 31.7 302.5
13 63.5 31.9 304.5
14 65.3 32.0 309.3
15 71.1 32.1 321.7
16 77.0 32.5 330.7
17 77.8 32.9 349.0
\.
--
-- Testing of basic single linear regression code
--
-- these queries should produce the same result.
select
regr_count(y, x1)::real as count,
regr_avgx(y, x1)::real as avgx,
regr_avgy(y, x1)::real as avgy,
regr_sxx(y, x1)::real as sxx,
regr_sxy(y, x1)::real as sxy,
regr_syy(y, x1)::real as syy,
regr_intercept(y, x1)::real as intercept,
regr_slope(y, x1)::real as slope,
regr_r2(y, x1)::real as r2
from weibull;
select
count(y)::real as count,
avg(x1)::real as avgx,
avg(y)::real as avgy,
((count(y) * sum(x1*x1) - sum(x1)^2)/count(y))::real as sxx,
((count(y) * sum(x1*y) - sum(x1)*sum(y))/count(y))::real as sxy,
((count(y) * sum(y*y) - sum(y)^2)/count(y))::real as sxy,
((sum(y)*sum(x1*x1) - sum(x1)*sum(x1*y))/(count(y) * sum(x1*x1) - sum(x1)^2))::real as intercept,
((count(y) * sum(x1*y) - sum(x1)*sum(y))/(count(y) * sum(x1*x1) - sum(x1)^2))::real as slope,
((count(y) * sum(x1*y) - sum(x1)*sum(y))^2/
((count(y) * sum(x1*x1) - sum(x1)^2) * (count(y) * sum(y*y) - sum(y)^2)))::real as r2
from weibull;
-- Single linear and multivariate should match for a single independent variable
select
array[regr_intercept(y, x1), regr_slope(y, x1)]::real[] as coef,
regr_r2(y,x1)::real as r2
from weibull;
select
array[regr_intercept(y, x2), regr_slope(y, x2)]::real[] as coef,
regr_r2(y,x2)::real as r2
from weibull;
DROP TABLE weibull;