@@ -164,6 +164,7 @@ def _get_default_result_dict(i1, i2, outcome_variable):
164164 "Full_Var2_beta" : np .nan ,
165165 "Full_Var2_SE" : np .nan ,
166166 "Full_Var2_Pval" : np .nan ,
167+ "Log" : "" ,
167168 }
168169
169170 def get_results (self ) -> pd .DataFrame :
@@ -232,10 +233,19 @@ def _run_interaction_regression(
232233 # in the result based on the specific requirements of the analysis
233234 if lrdf == 0 and lrstat == 0 :
234235 # Both models are equal
235- yield {"Converged" : False , "LRT_pvalue" : lr_pvalue }
236- if np .isnan (lr_pvalue ):
236+ yield {
237+ "Converged" : True ,
238+ "LRT_pvalue" : lr_pvalue ,
239+ "Log" : "Both models are equivalent in terms of fit" ,
240+ }
241+ elif np .isnan (lr_pvalue ):
237242 # There is an issue with the LRT calculation
238- yield {"Converged" : False , "LRT_pvalue" : lr_pvalue }
243+ # TODO: Extend the logs returns
244+ yield {
245+ "Converged" : True ,
246+ "LRT_pvalue" : lr_pvalue ,
247+ "Log" : "Both models are equivalent in terms of fit" ,
248+ }
239249 else :
240250 if report_betas :
241251 # Get beta, SE, and pvalue from interaction terms
@@ -278,14 +288,20 @@ def _run_interaction_regression(
278288 "Full_Var2_SE" : est .bse [term_2 ],
279289 "Full_Var2_Pval" : est .pvalues [term_2 ],
280290 "LRT_pvalue" : lr_pvalue ,
291+ "Log" : "" ,
281292 }
282293 else :
283294 # Only return the LRT result
284- yield {"Converged" : True , "LRT_pvalue" : lr_pvalue }
295+ yield {"Converged" : True , "LRT_pvalue" : lr_pvalue , "Log" : "" }
285296
286297 else :
287298 # Did not converge - nothing to update
288- yield dict ()
299+ # yield dict()
300+ yield {
301+ "Converged" : False ,
302+ "LRT_pvalue" : "NaN" ,
303+ "Log" : "One or Both models NOT Converge" ,
304+ }
289305
290306 def _get_interaction_specific_data (self , interaction : Tuple [str , str ]):
291307 """Select the data relevant to performing a regression on a given interaction, encoding genotypes if needed"""
@@ -407,6 +423,8 @@ def _run_interaction(
407423 # Get complete case mask and filter by min_n
408424 complete_case_mask = ~ data .isna ().any (axis = 1 )
409425 N = complete_case_mask .sum ()
426+ if N == 0 :
427+ raise ValueError (f"No Overlap (min_n filter: { N } < { min_n } )" )
410428 if N < min_n :
411429 raise ValueError (
412430 f"too few complete observations (min_n filter: { N } < { min_n } )"
@@ -476,5 +494,8 @@ def _run_interaction(
476494 error = str (e )
477495 if result is None :
478496 result_list = [cls ._get_default_result_dict (i1 , i2 , outcome_variable )]
497+ result_list [0 ]["Log" ] = error
498+ result_list [0 ]["Converged" ] = "NA"
499+ result_list [0 ]["N" ] = N
479500
480501 return result_list , warnings_list , error
0 commit comments