[Breaking Change] Intercept is now optional in regression and SKAT

To give users more control, we’ve changed inclusion of an intercept from implicit to explicit in linear regression, logistic regression, and SKAT. Consider the linear regression model

y = b*x + b0 + b1*c1 + b2*c2 + e

where we are interested the effect size b on x per row of a matrix table mt, and b0 represents an intercept.

BEFORE the intercept was implicitly added so you would write:

hl.linear_regression(y=mt.y, x=mt.x, covariates=[mt.c1, mt.c2]).

NOW the intercept must be included explicitly if desired so you should write:

hl.linear_regression(y=mt.y, x=mt.x, covariates=[1.0, mt.c1, mt.c2]).

Note that 1.0 is just a numeric expression (not special syntax) corresponding to a covariate that is 1.0 for every sample. This is equivalent to the model above, thought of as:

y = b*x + b0*1.0 + b1*c1 + b2*c2 + e

In sum: to get the same behavior as before, just add the covariate 1.0.

WARNING: The first command will still run but give different results, since it now corresponds to the model without intercept:

y = b*x + b1*c1 + b2*c2 + e.

As another example, now simple linear regression

y = b*x + b_0 + e

corresponds to

hl.linear_regression(y=mt.y, x=mt.x, covariates=[1.0]).

We’ve also removed the empty default value for covariates, so to do even simpler linear regression (not even an intercept!)

y = b*x + e

explicitly write the empty list [] in

hl.linear_regression(y=mt.y, x=mt.x, covariates=[]).

These changes also makes the regression interface more consistent with the linreg aggregator and LinearMixedModel class.