Public
Edited
Apr 22, 2024
Insert cell
Insert cell
Insert cell
Insert cell
values = [100, 30, 20, 10, 5, 3, 2, 1, 0.5].reverse()
Insert cell
probs = [
0.95, 0.9, 0.794118, 0.741176, 0.684163, 0.570136, 0.506787, 0.253394, 0
].reverse()
Insert cell
dx = [1 - 0.5, 2 - 1, 3 - 2, 5 - 3, 10 - 5, 20 - 10, 30 - 20, 100 - 30]
Insert cell
0.5 * 0.253394 +
1 * 0.506787 +
1 * 0.570136 +
2 * 0.684163 +
5 * 0.741176 +
10 * 0.794118 +
10 * 0.9 +
70 * 0.95
Insert cell
kmMean = function (values, probs) {
const v = [...values].reverse();
const p = [...probs].reverse();
let accum = 1;
let diffs = [];
for (let i = 0; i < v.length; i++) {
diffs.push(v[i + 1] - v[i]);
}
return diffs;
}
Insert cell
kmMean(values, probs)
Insert cell
differences = values.slice(1).map((value, index) => value - values[index])
Insert cell
p = probs.slice(1).map((d) => d / d3.sum(probs))
Insert cell
differences.reduce((sum, value, index) => {
return sum + value * p[index];
}, 0)
Insert cell
Insert cell
kaplanMeier = {
let array = data.sort((a, b) => b.value - a.value);
let originalData = [];
let nAtRisk = [];
let events = [];
let currentValue = null;
for (let i = 0; i < array.length; i++) {
if (!array[i].nonDetected) {
if (array[i].value !== currentValue) {
originalData.push(array[i].value);
currentValue = array[i].value;
nAtRisk.push(data.length - i);
events.push(1);
} else {
events[events.length - 1]++;
}
}
}

let incSurvProbs = [];
let survProbs = [];
for (let i = 0; i < nAtRisk.length; i++) {
incSurvProbs.push((nAtRisk[i] - events[i]) / nAtRisk[i]);
if (i === 0) {
survProbs.push(incSurvProbs[i]);
} else {
survProbs.push(survProbs[survProbs.length - 1] * incSurvProbs[i]);
}
}

return {
originalData,
nAtRisk,
events,
incSurvProbs,
survProbs
};
}
Insert cell
// refactored with forEach
kaplanMeier2 = {
const array = data.sort((a, b) => b.value - a.value);
const originalData = [];
const nAtRisk = [];
const events = [];
let currentValue = null;

array.forEach((item, i) => {
if (!item.nonDetected) {
if (item.value !== currentValue) {
originalData.push(item.value);
currentValue = item.value;
nAtRisk.push(data.length - i);
events.push(1);
} else {
events[events.length - 1]++;
}
}
});

const incSurvProbs = [];
const survProbs = [];

nAtRisk.forEach((risk, i) => {
incSurvProbs.push((risk - events[i]) / risk);
survProbs.push(
i === 0
? incSurvProbs[i]
: survProbs[survProbs.length - 1] * incSurvProbs[i]
);
});

return {
originalData,
nAtRisk,
events,
incSurvProbs,
survProbs
};
}
Insert cell
// optimized
kaplanMeier3 = (data) => {
const array = data.sort((a, b) => b.value - a.value);
const originalData = [];
const nAtRisk = [];
const events = [];
let currentValue = null;

array.forEach((item, i) => {
if (!item.nonDetected) {
if (item.value !== currentValue) {
originalData.push(item.value);
currentValue = item.value;
nAtRisk.push(data.length - i);
events.push(1);
} else {
events[events.length - 1]++;
}
}
});

const incSurvProbs = [];
const survProbs = [];
let lastSurvProb;

nAtRisk.forEach((risk, i) => {
const incSurvProb = (risk - events[i]) / risk;
incSurvProbs.push(incSurvProb);
lastSurvProb = i === 0 ? incSurvProb : lastSurvProb * incSurvProb;
survProbs.push(lastSurvProb);
});

return {
originalData,
nAtRisk,
events,
incSurvProbs,
survProbs
};
}
Insert cell
kaplanMeier3(data)
Insert cell
[3.2, 2.8, 1.7, 1.5, 0.9, 0.7, 0.6, 0.5].reverse()
Insert cell
// d3.scaleThreshold(
// [ 0.344, 0.458, 0.688, 0.786, 0.851, 0.917, 0.958],
// [0.5, 0.6, 0.7, 0.9, 1.5, 1.7, 2.8, 3.2]
// )(0.5)
d3.scaleThreshold(
[0.344, 0.458, 0.688, 0.786, 0.851, 0.917, 0.958],
[0.5, 0.6, 0.7, 0.9, 1.5, 1.7, 2.8, 3.2]
)(0.75)
Insert cell
// d3.scaleThreshold(
// [ 0, 0.344, 0.458, 0.688, 0.786, 0.851, 0.917, 0.958],
// [0.5, 0.6, 0.7, 0.9, 1.5, 1.7, 2.8, 3.2]
// )
Insert cell
// cdf = {
// const range = [3.2, 2.8, 1.7, 1.5, 0.9, 0.7, 0.6, 0.5].reverse();
// const domain = 0.5, 0.6, 0.7, 0.9, 1.5, 1.7, 2.8, 3.2];
// return d3.scaleThreshold(domain, range);
// }
Insert cell
// cdf(0.75)
Insert cell
data = [
{ value: 1.0, nonDetected: true },
{ value: 1.0, nonDetected: true },
{ value: 1.7, nonDetected: false },
{ value: 1.0, nonDetected: true },
{ value: 1.0, nonDetected: true },
{ value: 2.0, nonDetected: true },
{ value: 3.2, nonDetected: false },
{ value: 2.0, nonDetected: true },
{ value: 2.0, nonDetected: true },
{ value: 2.8, nonDetected: false },
{ value: 2.0, nonDetected: true },
{ value: 2.0, nonDetected: true },
{ value: 2.0, nonDetected: true },
{ value: 2.0, nonDetected: true },
{ value: 2.0, nonDetected: true },
{ value: 0.7, nonDetected: false },
{ value: 0.9, nonDetected: false },
{ value: 0.5, nonDetected: false },
{ value: 0.5, nonDetected: false },
{ value: 0.9, nonDetected: true },
{ value: 0.5, nonDetected: false },
{ value: 0.7, nonDetected: false },
{ value: 0.6, nonDetected: false },
{ value: 1.5, nonDetected: false }
]
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