'Minimal implementation of WLS optimized for performance.
Parameters
method : str, optional
Method to use to estimate parameters.  "pinv", "qr" or "lstsq"
* "pinv" uses the Moore-Penrose pseudoinverse
to solve the least squares problem.
* "qr" uses the QR factorization.
* "lstsq" uses the least squares implementation in numpy.linalg
Returns
results : namedtuple
Named tuple containing the fewest terms needed to implement
iterative estimation in models. Currently
* params : Estimated parameters
* fittedvalues : Fit values using original data
* resid : Residuals using original data
* model : namedtuple with one field, weights
* scale : scale computed using weighted residuals
Notes
Does not perform and checks on the input data
See Also
statsmodels.regression.linear_model.WLS'

def fit(self, method='pinv'):

    if (method == 'pinv'):
        pinv_wexog = np.linalg.pinv(self.wexog)
        params = pinv_wexog.dot(self.wendog)
    elif (method == 'qr'):
        (Q, R) = np.linalg.qr(self.wexog)
        params = np.linalg.solve(R, np.dot(Q.T, self.wendog))
    else:
        (params, _, _, _) = np.linalg.lstsq(self.wexog, self.wendog)
    fitted_values = self.exog.dot(params)
    resid = (self.endog - fitted_values)
    wresid = (self.wendog - self.wexog.dot(params))
    df_resid = (self.wexog.shape[0] - self.wexog.shape[1])
    scale = (np.dot(wresid, wresid) / df_resid)
    return Bunch(params=params, fittedvalues=fitted_values, resid=resid, model=self, scale=scale)
