Given results from a model run and the ground truth, compute metrics
(results)
| 834 | |
| 835 | |
| 836 | def compute_metrics(results): |
| 837 | """ |
| 838 | Given results from a model run and the ground truth, compute metrics |
| 839 | |
| 840 | """ |
| 841 | metrics = {} |
| 842 | metrics_pert = {} |
| 843 | |
| 844 | metric2fct = { |
| 845 | 'mse': mse, |
| 846 | 'pearson': pearsonr |
| 847 | } |
| 848 | |
| 849 | for m in metric2fct.keys(): |
| 850 | metrics[m] = [] |
| 851 | metrics[m + '_de'] = [] |
| 852 | |
| 853 | for pert in np.unique(results['pert_cat']): |
| 854 | |
| 855 | metrics_pert[pert] = {} |
| 856 | p_idx = np.where(results['pert_cat'] == pert)[0] |
| 857 | |
| 858 | for m, fct in metric2fct.items(): |
| 859 | if m == 'pearson': |
| 860 | val = fct(results['pred'][p_idx].mean(0), results['truth'][p_idx].mean(0))[0] |
| 861 | if np.isnan(val): |
| 862 | val = 0 |
| 863 | else: |
| 864 | val = fct(results['pred'][p_idx].mean(0), results['truth'][p_idx].mean(0)) |
| 865 | |
| 866 | metrics_pert[pert][m] = val |
| 867 | metrics[m].append(metrics_pert[pert][m]) |
| 868 | |
| 869 | |
| 870 | if pert != 'ctrl': |
| 871 | |
| 872 | for m, fct in metric2fct.items(): |
| 873 | if m == 'pearson': |
| 874 | val = fct(results['pred_de'][p_idx].mean(0), results['truth_de'][p_idx].mean(0))[0] |
| 875 | if np.isnan(val): |
| 876 | val = 0 |
| 877 | else: |
| 878 | val = fct(results['pred_de'][p_idx].mean(0), results['truth_de'][p_idx].mean(0)) |
| 879 | |
| 880 | metrics_pert[pert][m + '_de'] = val |
| 881 | metrics[m + '_de'].append(metrics_pert[pert][m + '_de']) |
| 882 | |
| 883 | else: |
| 884 | for m, fct in metric2fct.items(): |
| 885 | metrics_pert[pert][m + '_de'] = 0 |
| 886 | |
| 887 | for m in metric2fct.keys(): |
| 888 | |
| 889 | metrics[m] = np.mean(metrics[m]) |
| 890 | metrics[m + '_de'] = np.mean(metrics[m + '_de']) |
| 891 | |
| 892 | return metrics, metrics_pert |
| 893 |