Hosted by
ingenii
group1
and group2
, each of size . For a patient , group1[i]=1
and group2[i]=0
indicates that patient is assigned to group 1. If a patient is assigned to both groups (group1[i]=1
, group0[i]=1
) or to none (group1[i]=0
, group0[i]=0
) , the solution will be marked as unfeasible.aqora template ingenii-clinical-trial
cd ingenii-clinical-trial
aqora install
submission/solution.ipynb
with your solution. You can test your solution by runningaqora test
aqora upload
class ClinicalTrial:
rho: float # Relative importance between first and second moments
w: np.ndarray # Normalized patient covariates
def assert_valid(self, group1: np.ndarray, group2: np.ndarray) -> None:
"""
Checks if the patient constraints are met.
Arguments (where n is the number of patients):
- group1: np.ndarray(size = n) => Binary array of patients belonging to group 1
- group2: np.ndarray(size = n) => Binary array of patients belonging to group 2
Throws an AssertionError if the constraints are not met.
"""
group_size = int(self.w.shape[0] / 2)
# constraint 1: number of people in each group
assert (
np.sum(group1) == group_size
), f"Each group should have {group_size} patients"
# contraint 2: every patient is in one group
assert (
group1 + group2 == 1
).all(), "Every patient needs to be assigned to one group"
def discrepancy(self, group1: np.ndarray, group2: np.ndarray) -> float:
"""
Calculates discrepancy between patient groups.
Arguments (where n is the number of patients):
- group1: np.ndarray(size = n) => Binary array of patients belonging to group 1
- group2: np.ndarray(size = n) => Binary array of patients belonging to group 2
Returns:
- float => Value of discrepancy measure for group1 and group2
"""
# Check that all the constraints are being met
self.assert_valid(group1, group2)
# Order of the groups is arbitrary
if group1[0] == 0:
group1, group2 = group2, group1
n, r = self.w.shape
# Calculate mean values for each covariate
Mu = []
for i in range(r):
Mu.append(self.w[:, i].dot(group1 - group2) / n)
# Calculate second moments (variance and covariance)
Var_ii = [] # variance
Var_ij = [] # covariance
for i in range(r):
for j in range(i, r):
if i == j:
Var_ii.append((self.w[:, i] ** 2).dot(group1 - group2) / n)
else:
Var_ij.append(
(self.w[:, i] * self.w[:, j]).dot(group1 - group2) / n
)
# Calculate final discrepancy
discrepancy = (
np.sum(np.abs(Mu))
+ self.rho * np.sum(np.abs(Var_ii))
+ 2 * self.rho * np.sum(np.abs(Var_ij))
)
return discrepancy