Published
Edited
Oct 13, 2021
Importers
1 star
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Inputs.table(dataMatch)
Insert cell
Insert cell
Insert cell
Insert cell
url = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+patient.drug.openfda.generic_name:(%22'+drugName+'%22)+AND+receivedate:(['+dateFrom+'+TO+'+dateTo+'])&limit=1000&count=patient.reaction.reactionmeddrapt.exact&skip=0'
Insert cell
raw = await fetch(url).then(res => res.json())
Insert cell
rawTable = Inputs.table(raw.results)
Insert cell
Insert cell
url2 = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+_exists_:(patient.reaction.reactionmeddrapt.exact)+AND+_exists_:(patient.drug.openfda.generic_name)+AND+receivedate:(['+dateFrom+'+TO+'+dateTo+'])&count=patient.reaction.reactionmeddrapt.exact&limit=1000&sort=patient.reaction.reactionmeddrapt.exact:desc'
Insert cell
raw2 = await fetch(url2).then(res => res.json())
Insert cell
raw2Table = Inputs.table(raw2.results)
Insert cell
Insert cell
Insert cell
dataTop = raw.results.sort((a,b) => b.count - a.count)
.filter((n,i) => i < maxNumberOfEvent)
.map(n => ({
AE: n.term,
ntrt: +n.count
}));
Insert cell
dataTopTerm = [...new Set(dataTop.map(n => n.AE))]
Insert cell
Insert cell
dataOther = raw.results.sort((a,b) => b.count - a.count)
.filter((n,i) => i >= maxNumberOfEvent)
.map(n => ({
AE: n.term,
ntrt: +n.count
}));
Insert cell
Insert cell
countDrugOtherTotal = dataOther.reduce((p,c)=>{p += c.ntrt; return p;}, 0);
Insert cell
Insert cell
dataAll = raw2.results.sort((a,b) => b.count - a.count)
.map(n => ({
AE: n.term,
nidot: +n.count
}));
Insert cell
Insert cell
dataUnMatch.view()
Insert cell
dataUnMatch = aq.from(dataTop).antijoin(aq.from(dataAll), ['AE', 'AE'], [aq.all(), aq.not('AE')]);
Insert cell
dataUnMatchTerm = [...new Set(dataUnMatch.objects().map(n => n.AE))];
Insert cell
Insert cell
drugAllFinal = {
for (let k of dataUnMatchTerm) {
var kStr = k.split(' ').join('%20');
var urlK = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+_exists_:(patient.drug.openfda.generic_name)+AND+patient.reaction.reactionmeddrapt.exact:(%22'+kStr+'%22)+AND+receivedate:(['+dateFrom+'+TO+'+dateTo+'])&limit=1&skip=0';
var dataK = await fetch(urlK).then(res => res.json())
dataAll.push({'AE': k, 'nidot': dataK.meta.results.total});
}
return dataAll;
}
Insert cell
countDrugAllFinalOther = drugAllFinal.filter(n => dataTopTerm.indexOf(n.AE) == -1).reduce((p,c) => {p += c.nidot; return p;},0);
Insert cell
Insert cell
dataMatch = {
var dataMatch = aq.from(dataTop).join_left(aq.from(drugAllFinal), ['AE', 'AE'], [aq.all(), aq.not('AE')]).objects()
.filter(n => n.nidot !== undefined);
dataMatch.push({
'AE': 'Other',
'ntrt': countDrugOtherTotal,
'nidot': countDrugAllFinalOther
});

dataMatch.map(n => n.ndotj = dataMatch.reduce((p,c) => {p += c.ntrt; return p;}, 0));
dataMatch.map(n => n.ndotdot = dataMatch.reduce((p,c) => {p += c.nidot; return p;}, 0));
return dataMatch;
}
Insert cell
Insert cell
LRTDataTable = Inputs.table(LRTData)
Insert cell
async function generateLRTData() {
var url = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+patient.drug.openfda.generic_name:(%22'+drugName+'%22)+AND+receivedate:(['+dateFrom+'+TO+'+dateTo+'])&limit=1000&count=patient.reaction.reactionmeddrapt.exact&skip=0';
var raw = await fetch(url).then(res => res.json());

var url2 = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+_exists_:(patient.reaction.reactionmeddrapt.exact)+AND+_exists_:(patient.drug.openfda.generic_name)+AND+receivedate:(['+dateFrom+'+TO+'+dateTo+'])&count=patient.reaction.reactionmeddrapt.exact&limit=1000&sort=patient.reaction.reactionmeddrapt.exact:desc';
var raw2 = await fetch(url2).then(res => res.json());

var dataTop = raw.results.sort((a,b) => b.count - a.count).filter((n,i) => i < maxNumberOfEvent).map(n => ({AE: n.term,ntrt: +n.count}));
var dataTopTerm = [...new Set(dataTop.map(n => n.AE))];
var dataOther = raw.results.sort((a,b) => b.count - a.count).filter((n,i) => i >= maxNumberOfEvent).map(n => ({AE: n.term,ntrt: +n.count}));
var countDrugOtherTotal = dataOther.reduce((p,c)=>{p += c.ntrt; return p;}, 0);

var dataAll = raw2.results.sort((a,b) => b.count - a.count).map(n => ({AE: n.term,nidot: +n.count}));

var dataUnMatch = aq.from(dataTop).antijoin(aq.from(dataAll), ['AE', 'AE'], [aq.all(), aq.not('AE')]);
var dataUnMatchTerm = [...new Set(dataUnMatch.objects().map(n => n.AE))];

for (let k of dataUnMatchTerm) {
var kStr = k.split(' ').join('%20');
var urlK = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+_exists_:(patient.drug.openfda.generic_name)+AND+patient.reaction.reactionmeddrapt.exact:(%22'+kStr+'%22)+AND+receivedate:(['+dateFrom+'+TO+'+dateTo+'])&limit=1&skip=0';
var dataK = await fetch(urlK).then(res => res.json())
dataAll.push({'AE': k, 'nidot': dataK.meta.results.total});
}

var countDrugAllFinalOther = dataAll.filter(n => dataTopTerm.indexOf(n.AE) == -1).reduce((p,c) => {p += c.nidot; return p;},0);
var dataMatch = aq.from(dataTop).join_left(aq.from(dataAll), ['AE', 'AE'], [aq.all(), aq.not('AE')]).objects()
.filter(n => n.nidot !== undefined);
dataMatch.push({
'AE': 'Other',
'ntrt': countDrugOtherTotal,
'nidot': countDrugAllFinalOther
});

dataMatch.map(n => n.ndotj = dataMatch.reduce((p,c) => {p += c.ntrt; return p;}, 0));
dataMatch.map(n => n.ndotdot = dataMatch.reduce((p,c) => {p += c.nidot; return p;}, 0));

return dataMatch;
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
async function generateLRTYearData() {

var LRTYearDataContainer = [];
for(var i of yearList){

var url = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+patient.drug.openfda.generic_name:(%22'+drugName+'%22)+AND+receivedate:(['+i+'-01-01+TO+'+i+'-12-31])&limit=1000&count=patient.reaction.reactionmeddrapt.exact&skip=0';
var raw = await fetch(url).then(res => res.json());

var url2 = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+_exists_:(patient.reaction.reactionmeddrapt.exact)+AND+_exists_:(patient.drug.openfda.generic_name)+AND+receivedate:(['+i+'-01-01+TO+'+i+'-12-31])&count=patient.reaction.reactionmeddrapt.exact&limit=1000&sort=patient.reaction.reactionmeddrapt.exact:desc';
var raw2 = await fetch(url2).then(res => res.json());

var dataTop = raw.results.sort((a,b) => b.count - a.count).filter((n,i) => i < maxNumberOfEvent).map(n => ({Year: i.toString(), AE: n.term,ntrt: +n.count}));
var dataTopTerm = [...new Set(dataTop.map(n => n.AE))];
var dataOther = raw.results.sort((a,b) => b.count - a.count).filter((n,i) => i >= maxNumberOfEvent).map(n => ({Year: i.toString(),AE: n.term,ntrt: +n.count}));
var countDrugOtherTotal = dataOther.reduce((p,c)=>{p += c.ntrt; return p;}, 0);

var dataAll = raw2.results.sort((a,b) => b.count - a.count).map(n => ({Year: i, AE: n.term, nidot: +n.count}));

var dataUnMatch = aq.from(dataTop).antijoin(aq.from(dataAll), ['AE', 'AE'], [aq.all(), aq.not('AE')]);
var dataUnMatchTerm = [...new Set(dataUnMatch.objects().map(n => n.AE))];

for (var k of dataUnMatchTerm) {
var kStr = k.split(' ').join('%20');
var urlK = 'https://api.fda.gov/drug/event.json?search=_exists_:(patient.drug.openfda.generic_name)+AND+_exists_:(patient.drug.openfda.generic_name)+AND+patient.reaction.reactionmeddrapt.exact:(%22'+kStr+'%22)+AND+receivedate:(['+i+'-01-01+TO+'+i+'-12-31])&limit=1&skip=0';
var dataK = await fetch(urlK).then(res => res.json())
dataAll.push({'AE': k, 'nidot': dataK.meta.results.total});
}

var countDrugAllFinalOther = dataAll.filter(n => dataTopTerm.indexOf(n.AE) == -1).reduce((p,c) => {p += c.nidot; return p;},0);
var dataMatch = aq.from(dataTop).join_left(aq.from(dataAll), ['AE', 'AE'], [aq.all(), aq.not(['Year', 'AE'])]).objects()
.filter(n => n.nidot !== undefined);
dataMatch.push({
'Year': i.toString(),
'AE': 'Other',
'ntrt': countDrugOtherTotal,
'nidot': countDrugAllFinalOther
});
dataMatch.map(n => n.ndotj = dataMatch.reduce((p,c) => {p += c.ntrt; return p;}, 0));
dataMatch.map(n => n.ndotdot = dataMatch.reduce((p,c) => {p += c.nidot; return p;}, 0));

LRTYearDataContainer.push(...dataMatch);
}
return LRTYearDataContainer;
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
import { aq, op } from '@uwdata/arquero'
Insert cell
Insert cell
Insert cell
// import { py, pyodide } from '@gnestor/pyodide'
Insert cell
Insert cell
Insert cell
// funcLRT = py`import numpy as np
// import pandas as pd
// def flogLRv(x, fnidot, fndotj, fndotdot):
// logLRvr = x * (np.log(x) - np.log(fnidot))
// logLRvr = logLRvr + (fndotj - x) * (np.log(fndotj - x) - np.log(fndotdot - fnidot))
// logLRvr = logLRvr - fndotj * (np.log(fndotj) - np.log(fndotdot));
// logLRvr.fillna(0)
// pj = x / fnidot
// qj = (fndotj - x) / (fndotdot - fnidot)
// logLRvr[ pj < qj ] = 0
// return logLRvr

// def fLRT(qnum, number, alpha = 0.05, alphaSpending = 1):
// mylist = qnum
// mylist["ntrt"] = pd.to_numeric(mylist["ntrt"])
// mylist["nidot"] = pd.to_numeric(mylist["nidot"])
// mylist["ndotj"] = pd.to_numeric(mylist["ndotj"])
// mylist["ndotdot"] = pd.to_numeric(mylist["ndotdot"])
// mylist["logLR"] = flogLRv(mylist["ntrt"], mylist["nidot"], mylist["ndotj"][0], mylist["ndotdot"][0])
// mylist = mylist.sort_values("logLR", ascending=False)
// cnstR = number
// np.random.seed(123)
// mylist["Pvector"] = mylist["nidot"] / mylist["ndotdot"]
// sim_cntdata = np.random.multinomial(mylist["ndotj"][0], mylist["Pvector"], size = cnstR)
// logLRsim = np.array([flogLRv(i, mylist["nidot"], mylist["ndotj"][0], mylist["ndotdot"][0]) for i in sim_cntdata])
// maxlogLRsim = np.array([np.max(i) for i in logLRsim])
// mylist["T_alpha"] = np.quantile(maxlogLRsim, 1 - alpha)
// mylist["pvalue"] = np.array([ np.mean(maxlogLRsim > i) for i in mylist["logLR"]])
// if alphaSpending >= 1:
// mylist["is_signal"] = (mylist["logLR"] > mylist["T_alpha"])
// else:
// mylist["alpha"] = alphaSpending
// mylist["is_signal"] = (mylist["pvalue"] < alphaSpending)
// mylist = mylist.sort_values("logLR", ascending=False)
// return mylist

// fLRT`
Insert cell
// LRTResult = py`import pandas as pd
// ${funcLRT}(pd.read_json(${JSON.stringify(LRTData)}),100).to_json(orient="records")`
Insert cell
// LRTResultJSON = JSON.parse(LRTResult)
Insert cell
LRTResultJSONImport = await FileAttachment("LRTResultJSON.json").json()
Insert cell
LRTResultTable = Inputs.table(
LRTResultJSONImport,
// JSON.parse(LRTResult),
{columns: ["AE", "ntrt", "nidot", "ndotj", "ndotdot", "logLR", "T_alpha", "pvalue", "is_signal"],
width: {AE: 250},
// height: 550,
align: {
ntrt: "center",
nidot: "center",
ndotj: "center",
ndotdot: "center",
logLR: "center",
T_alpha: "center",
pvalue: "center",
is_signal: "center"
}
})
Insert cell
Insert cell
// LRTResultYear = py`import pandas as pd
// import numpy as np
// LRT_result_Year = pd.DataFrame()

// for k in range(len(${yearList})):
// LRTYearData = pd.read_json(${JSON.stringify(LRTYearData)})
// countAeListYeark = LRTYearData[LRTYearData["Year"] <= ${yearList}[k]].groupby("AE").agg({"ntrt": "sum"})
// countAeListTotalYeark = LRTYearData[LRTYearData["Year"] <= ${yearList}[k]].groupby("AE").agg({"nidot": "sum"})
// combine_data_Yeark = pd.concat([countAeListYeark, countAeListTotalYeark], axis=1, join="inner")
// combine_data_Yeark["ndotj"] = np.sum(combine_data_Yeark["ntrt"])
// combine_data_Yeark["ndotdot"] = np.sum(combine_data_Yeark["nidot"])
// alphaSpending = 0.05 / (2**k)
// LRT_result_Yeark = ${funcLRT}(combine_data_Yeark, 100, alphaSpending = alphaSpending)
// LRT_result_Yeark["year"] = str(${yearList}[k])
// LRT_result_Year = LRT_result_Year.append(LRT_result_Yeark)
// LRT_result_Year['AE'] = LRT_result_Year.index

// LRT_result_Year.to_json(orient="records")`
Insert cell
// LRTResultYearJSON = JSON.parse(LRTResultYear)
Insert cell
LRTResultYearJSONImport = await FileAttachment("LRTResultYearJSON.json").json()
Insert cell
LRTResultByYearTable = Inputs.table(
LRTResultYearJSONImport,
// JSON.parse(LRTResultYear),
{columns: ["AE", "year", "ntrt", "nidot", "ndotj", "ndotdot", "logLR", "T_alpha", "pvalue", "alpha", "is_signal"],
width: {AE: 160},
// height: 550,
align: {
ntrt: "center",
nidot: "center",
ndotj: "center",
ndotdot: "center",
logLR: "center",
T_alpha: "center",
pvalue: "center",
is_signal: "center"
}
})
Insert cell
Insert cell
Insert cell
Insert cell
margin = ({top: 30, right: 30, bottom: 50, left: 240})
Insert cell
Insert cell
heatMapAE = addAnimation(
addTooltips(
Plot.plot({
padding: 0.01,
marginLeft: 250,
marks: [
Plot.cell(
LRTResultYearJSONImport,
// JSON.parse(LRTResultYear),
{
x: (d) => d.year,
y: (d) => d.AE,
fill: (d) => d.pvalue,
fillOpacity: 0.8,
inset: 0.5,
title: (d) =>
`${d.AE} \nYear: ${d.year} \nIs Signal: ${d.is_signal} \nLogLR: ${parseFloat(d.logLR).toFixed(2)} \nP-Value: ${d.pvalue} \nAlpha: ${d.alpha}`
}
),
Plot.text(
LRTResultYearJSONImport,
// JSON.parse(LRTResultYear),
{
x: "year",
y: "AE",
text: d => d.is_signal == true ? '❕' : ''
}
)
],
color: {
type: "linear",
domain: [0, 0.06, 1],
range: ["#fc836a", "#3BAFDA", "lightblue"]
},
x: {
axis: "top",
label: ''
},
y: {
label: ''
},
width,
height: 1500
})
),
{ type: "rect", delay: 2 }
)
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more