Changeset 10643:79cc41d29eb7 in orange


Ignore:
Timestamp:
03/26/12 15:48:33 (2 years ago)
Author:
Lan Zagar <lan.zagar@…>
Branch:
default
rebase_source:
88f2d0bbd5c094dd32667be3498d631f76c5c883
Message:

Corrections to computations of statistics in linear regression.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/regression/linear.py

    r10616 r10643  
    148148    before fitting the regression parameters. 
    149149 
    150     """     
     150    """ 
    151151 
    152152    def __init__(self, name='linear regression', intercept=True, 
     
    197197        self.use_vars = use_vars 
    198198        self.__dict__.update(kwds) 
    199          
     199 
    200200    def __call__(self, table, weight=None, verbose=0): 
    201201        """ 
     
    207207        :type weight: None or list of Orange.feature.Continuous 
    208208            which stores weights for instances 
    209         """        
     209        """ 
    210210        if self.use_vars is not None: 
    211211            new_domain = Orange.data.Domain(self.use_vars, 
     
    214214            table = Orange.data.Table(new_domain, table) 
    215215 
    216         # discrete values are continuized         
     216        # discrete values are continuized 
    217217        table = self.continuize_table(table) 
    218            
     218 
    219219        # missing values are imputed 
    220220        table = self.impute_table(table) 
     
    232232        X, y, w = table.to_numpy() 
    233233        n, m = numpy.shape(X) 
    234       
     234 
    235235        if self.intercept: 
    236236            X = numpy.insert(X, 0, 1, axis=1) # adds a column of ones 
    237          
     237 
    238238        if weight: 
    239239            weights = numpy.sqrt([float(ins[weight]) for ins in table]) 
    240240            X = weights.reshape(n, 1) * X 
    241241            y = weights * y 
    242          
     242 
    243243        cov = dot(X.T, X) 
    244          
     244 
    245245        if self.ridge_lambda: 
    246246            stride = cov.shape[0] + 1 
     
    265265                coefficients=coefficients, std_coefficients=std_coefficients, 
    266266                intercept=self.intercept) 
    267              
    268267 
    269268        fitted = dot(X, coefficients) 
     
    271270                     for i, ins in enumerate(table)] 
    272271 
    273         # model summary         
     272        # model summary 
     273        df_reg = n - m - self.intercept 
    274274        # total sum of squares (total variance) 
    275275        sst = numpy.sum((y - mu_y) ** 2) 
    276         # sum of squares due to regression (explained variance) 
     276        # regression sum of squares (explained variance) 
    277277        ssr = numpy.sum((fitted - mu_y) ** 2) 
    278         # error sum of squares (unexplaied variance) 
    279         sse = sst - ssr 
     278        # residual sum of squares 
     279        sse = numpy.sum((y - fitted) ** 2) 
    280280        # coefficient of determination 
    281281        r2 = ssr / sst 
    282         r2adj = 1 - (1 - r2) * (n - 1) / (n - m - 1) 
    283         F = (ssr / m) / (sst - ssr / (n - m - 1)) if m else None 
    284         df = n - 2 
    285         sigma_square = sse / (n - m - 1) 
     282        r2 = 1 - sse / sst 
     283        r2adj = 1 - (1 - r2) * (n - 1) / df_reg 
     284        F = (ssr / m) / ((sst - ssr) / df_reg) if m else 0 
     285        sigma_square = sse / df_reg 
    286286        # standard error of the regression estimator, t-scores and p-values 
    287287        std_error = sqrt(sigma_square * invcov.diagonal()) 
    288288        t_scores = coefficients / std_error 
    289         p_vals = [stats.betai(df * 0.5, 0.5, df / (df + t * t)) 
     289        df_res = n - 2 
     290        p_vals = [stats.betai(df_res * 0.5, 0.5, df_res / (df_res + t * t)) 
    290291                  for t in t_scores] 
    291292 
     
    300301            dict_model[var.name] = (coefficients[j], std_error[j], 
    301302                                    t_scores[j], p_vals[j]) 
    302          
     303 
    303304        return LinearRegression(domain.class_var, domain, coefficients, F, 
    304305                 std_error=std_error, t_scores=t_scores, p_vals=p_vals, 
     
    323324 
    324325    .. attribute:: F 
    325      
     326 
    326327        F-statistics of the model. 
    327328 
     
    333334    .. attribute:: std_error 
    334335 
    335         Standard errors of the coefficient estimator, stored in list.     
     336        Standard errors of the coefficient estimator, stored in list. 
    336337 
    337338    .. attribute:: t_scores 
    338339 
    339         List of t-scores for the estimated regression coefficients.     
     340        List of t-scores for the estimated regression coefficients. 
    340341 
    341342    .. attribute:: p_vals 
     
    343344        List of p-values for the null hypothesis that the regression 
    344345        coefficients equal 0 based on t-scores and two sided 
    345         alternative hypothesis.     
     346        alternative hypothesis. 
    346347 
    347348    .. attribute:: dict_model 
     
    364365    .. attribute:: m 
    365366 
    366         Number of independent (predictor) variables.     
     367        Number of independent (predictor) variables. 
    367368 
    368369    .. attribute:: n 
    369370 
    370         Number of instances.     
     371        Number of instances. 
    371372 
    372373    .. attribute:: mu_y 
    373374 
    374         Sample mean of the dependent variable.     
     375        Sample mean of the dependent variable. 
    375376 
    376377    .. attribute:: r2 
     
    393394        Standardized regression coefficients. 
    394395 
    395     """    
    396  
    397  
    398      
     396    """ 
     397 
    399398    def __init__(self, class_var=None, domain=None, coefficients=None, F=None, 
    400399                 std_error=None, t_scores=None, p_vals=None, dict_model=None, 
     
    433432                         variable will be predicted 
    434433        :type instance: :obj:`~Orange.data.Instance` 
    435         """         
     434        """ 
    436435        ins = Orange.data.Instance(self.domain, instance) 
    437436        ins = numpy.array(ins.native()) 
     
    462461        return (y_hat, dist) 
    463462 
    464  
    465463    def to_string(self): 
    466464        """Pretty-prints linear regression model, 
     
    469467 
    470468        """ 
    471         from string import join  
     469        from string import join 
    472470        labels = ('Variable', 'Coeff Est', 'Std Error', 't-value', 'p') 
    473471        lines = [join(['%10s' % l for l in labels], ' ')] 
     
    482480            elif p < 0.1: return  "." 
    483481            else: return " " 
    484          
     482 
    485483        if self.intercept == True: 
    486484            stars =  get_star(self.p_vals[0]) 
     
    512510 
    513511    :param c1, c2: linear regression model objects. 
    514     :type lr: :class:`LinearRegression`      
     512    :type lr: :class:`LinearRegression` 
    515513 
    516514    """ 
     
    548546    """ 
    549547 
    550      
    551548    inc_vars = [] 
    552549    not_inc_vars = table.domain.attributes 
     
    565562            except Exception: 
    566563                reduced_model.append(None) 
    567          
     564 
    568565        sigs = [compare_models(r, c0) for r in reduced_model] 
    569566        if sigs and max(sigs) > remove_sig: 
     
    584581            except Exception: 
    585582                extended_model.append(None) 
    586               
     583 
    587584        sigs = [compare_models(c0, r) for r in extended_model] 
    588585        if sigs and min(sigs) < add_sig: 
Note: See TracChangeset for help on using the changeset viewer.