Salut à tous, j'ai une question assez complexe sur la façon d'organiser les données dans jmp.Fondamentalement, je regarde le suivi des patients et le temps qu'il leur faudra pour développer une maladie particulière. J'ai 3 colonnes de données. La colonne 1 est le code identifiable de chaque patient. Presque tous les patients sont répertoriés plusieurs fois dans la colonne 1 car ils ont eu plusieurs suivis. La colonne 2 est un code binaire indiquant s'ils ont ou non la maladie (0=pas de maladie, 1=maladie) à cette date de suivi. Et la colonne 3 est leur date de suivi.
Ce que je veux faire, c'est isoler lorsque la colonne 2 passe de 0—> 1 pour la première fois pour chaque patient (cela peut se produire plusieurs fois pour chaque patient car ils auraient pu être traités et guéris, réinitialisant ainsi la maladie à 0, donc Je veux juste la première fois 0-->1). J'ai besoin des deux valeurs
parce que je prends la moyenne de leurs dates de suivi correspondantes pour approximer la date à laquelle ils étaient positifs pour la maladie. Le reste des données dont je n'ai pas besoin.
J'espère que cela a du sens, s'il vous plaît laissez-moi savoir si je dois développer. Désolé d'avance si ce n'est pas ce que JMP est censé faire. Merci!
Le patient n'a-t-il qu'une seule valeur de maladie 0 avant la première valeur de maladie 1 ou peut-il y avoir plusieurs valeurs 0 avant la première 1 ?
Éditer:
Voici deux solutions possibles en fonction des données :
Dans le premier, triez d'abord les données par patientid et heure, puis créez deux colonnes de formules et vérifiez que les informations qui vous intéressent devraient être présentes. Il peut y avoir des cas limites que cela manquera (comme la dernière ligne).
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(14),
Compress File When Saved(1),
New Column("PatientID",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([1, 1, 1, 1, 2, 2, 1, 3, 3, 3, 3, 1, 1, 1]),
Set Display Width(62)
),
New Column("Status",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0]),
Set Display Width(50)
),
New Column("Time",
Numeric,
"Continuous",
Format("m.d.y h:m", 19),
Input Format("m.d.y h:m"),
Set Values(
[3660718210, 3660718260, 3660718320, 3660718380, 3660718440, 3660718500, 3660718560, 3660718620, 3660718680,
3660718740, 3660718800, 3660718860, 3660718920, 3660718920]
)
)
);
// Sort data table
dt << Sort(By(:PatientID, :Time), Replace Table, Order(Ascending, Ascending));
//add formula columns
dt << New Column("CumSumOfStatus",
Numeric,
"Continuous",
Format("Best", 12),
Formula(Col Cumulative Sum(:Status, :PatientID))
);
//add formula columns
dt << New Column("Check",
Numeric,
"Continuous",
Format("Best", 12),
Formula(
If(Row() == 1, :Status);
If(Lag(:CumSumOfStatus, -1) == 1 & Lag(:PatientID) == :PatientID,
1,
0
);
)
);
Le deuxième s'attend à ce que patientid n'ait qu'un seul statut 0 avant le premier statut 1, ce qui vous permet d'obtenir simplement le temps minimum pour les deux statuts en utilisant le résumé :
//If only one 0 before 1
dt2 = New Table("Untitled",
Add Rows(11),
Compress File When Saved(1),
New Column("PatientID",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3]),
Set Display Width(62)
),
New Column("Status",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0]),
Set Display Width(50)
),
New Column("Time",
Numeric,
"Continuous",
Format("m.d.y h:m", 19),
Input Format("m.d.y h:m"),
Set Values(
[3660718380, 3660718560, 3660718860, 3660718920, 3660718920, 3660718440, 3660718500, 3660718620, 3660718680,
3660718740, 3660718800]
)
)
);
dt << Summary(Group(:PatientID), Min(:Time), Subgroup(:Status), Freq("None"), Weight("None"));