virgil/commit
FIX prr computation. Use drug-reaction cooccurrences instead of report count
author | Michiel Hildebrand |
---|---|
Fri Mar 15 14:58:53 2013 +0100 | |
committer | Michiel Hildebrand |
Fri Mar 15 15:01:12 2013 +0100 | |
commit | 8ef3b915eb91d000b3571faf520139b6871f5a02 |
tree | 6297b1aaa9cef4f608d702e3bfcdff17c30e6d05 |
parent | 4cf01e4e0b6519ff1199a898b46d07fb4dc77a2f |
Diff style: patch stat
diff --git a/api/measurements.pl b/api/measurements.pl index 304b939..fbc151a 100644 --- a/api/measurements.pl +++ b/api/measurements.pl @@ -1,5 +1,5 @@ :- module(measurements, - [flush_virgil_cache/0 + [ ]). :- use_module(library(http/http_dispatch)). @@ -10,8 +10,7 @@ :- http_handler(cliopatria(aers/api/measurements/prr), http_measurements_prr, []). -:- dynamic - virgil_cache/2. + http_measurements_prr(Request) :- http_parameters(Request, @@ -32,10 +31,18 @@ prr_per_reaction([Reaction|Rs], Drugs, [Obj|Os]) :- prr_per_reaction(Rs, Drugs, Os). prr(Drugs, Reaction, PRR, Prov) :- - drug_reactions(Drugs, DRs), - length(DRs, D), - proof_count(member(Reaction-_, DRs), DE), + % total drug cooccurrences + drug_reaction_counts(Drugs, DRs), + pairs_keys(DRs, DR_Counts), + sumlist(DR_Counts, D), + + % drug-reaction cooccurrences + memberchk(DE-Reaction, DRs), + + % reaction cooccurrences reaction_count(Reaction, E), + + % total cooccurrences cc_count(A), PRR is (DE/D)/((E-DE)/(A-D)), @@ -48,30 +55,7 @@ prr(Drugs, Reaction, PRR, Prov) :- %Prov = (DE/D)/((E-DE)/(A-D)). -drug_reactions(Drugs, DRs) :- - virgil_cache(drug(Drugs), DRs), - !. -drug_reactions(Drugs, DRs) :- - setof(R-Report, reaction(Drugs, [], R, Report), DRs), - assert(virgil_cache(drug(Drugs), DRs)). - -reaction_count(Reaction, Count) :- - virgil_cache(reaction(Reaction), Count), - !. -reaction_count(Reaction, Count) :- - setof(R, report([], [Reaction], [], R), Es), - length(Es, Count), - assert(virgil_cache(reaction(Reaction), Count)). - -cc_count(Count) :- - virgil_cache(cc, Count), - !. -cc_count(Count) :- - setof(R, report([], [], [], R), As), - length(As, Count), - assert(virgil_cache(cc, Count)). - - -flush_virgil_cache :- - retractall(virgil_cache(_, _)). + + + diff --git a/api/reactions.pl b/api/reactions.pl index 477afaa..d3f7663 100644 --- a/api/reactions.pl +++ b/api/reactions.pl @@ -22,11 +22,7 @@ http_reactions(Request) :- offset(Offset, [default(0)]) ]), - findall(Count-Reaction, - ( setof(R, reaction(DrugNames, [], Reaction, R), Rs), - length(Rs, Count) - ), - Reactions0), + drug_reaction_counts(DrugNames, Reactions0), keysort(Reactions0, Reactions1), reverse(Reactions1, Reactions), length(Reactions, Total_Reactions), diff --git a/lib/aers_report.pl b/lib/aers_report.pl index 8d07ae3..bfe4fa7 100644 --- a/lib/aers_report.pl +++ b/lib/aers_report.pl @@ -2,12 +2,24 @@ [report/4, report_by_drug/2, report_by_filter/2, - reaction/4 + reaction/4, + drug_reaction_counts/2, + reaction_count/2, + cc_count/1, + flush_virgil_cache/0 ]). :- use_module(library(semweb/rdf_db)). :- use_module(library(semweb/rdf_label)). +:- dynamic + virgil_cache/2. + +flush_virgil_cache :- + retractall(virgil_cache(_, _)). + +%% report(+DrugMentionList, -ReactionTerms, +ReportFilter, -Report) + report(Drugs, Reactions, Filter, Report) :- ( Drugs = [_|_] -> report_by_drug(Drugs, Report) @@ -33,7 +45,8 @@ report_by_reaction([_|T], Report) :- report_by_filter([], Report) :- rdf(Report, rdf:type, aers:'Report'). -%% reaction(+Drugs, +Filter, ?Reaction, -Report) + +%% reaction(+DrugMentionList, +Filter, ?Reaction, -Report) reaction(Drugs, Filter, Reaction, Report) :- ( Drugs = [_|_] @@ -43,3 +56,54 @@ reaction(Drugs, Filter, Reaction, Report) :- report_by_filter(Filter, Report), rdf(Report, aers:reaction, Reaction_Lit), literal_text(Reaction_Lit, Reaction). + + +%% drug_reacton_counts(+DrugMentionList, -Pairs:count-reaction) + +drug_reaction_counts(Drugs, DRs) :- + virgil_cache(drug(Drugs), DRs), + !. +drug_reaction_counts(Drugs, DRs) :- + findall(Count-Reaction, + (setof(R, reaction(Drugs, [], Reaction, R), Rs), + length(Rs, Count) + ), DRs), + assert(virgil_cache(drug(Drugs), DRs)). + + +%% reaction_count(+Reaction, -ReactionCount) + +reaction_count(Reaction, Count) :- + virgil_cache(reaction(Reaction), Count), + !. +reaction_count(Reaction, Count) :- + setof(R-D, (report([], [Reaction], [], R), + report_drug_name(R, D) + ), + Es), + length(Es, Count), + assert(virgil_cache(reaction(Reaction), Count)). + +%% cc_count(-Count) + +cc_count(Count) :- + virgil_cache(cc, Count), + !. +cc_count(Count) :- + setof(R-D-E, report_drug_reaction([], R, D, E), As), + length(As, Count), + assert(virgil_cache(cc, Count)). + + +report_drug_reaction(Filter, Report, DrugName, Reaction) :- + report_by_filter(Filter, Report), + report_drug_name(Report, DrugName), + report_reaction(Report, Reaction). + +report_drug_name(Report, Drug) :- + rdf(Report, aers:drug, DrugUse), + rdf(DrugUse, aers:drugname, literal(Drug)). + +report_reaction(Report, Reaction) :- + rdf(Report, aers:reaction, literal(Reaction)). +