Comment gérer les données manquantes<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour,
Je dois exécuter une analyse descriptive sur un grand nombre de colonnes. Pour ce faire, j'ai créé le script suivant :
dt = table de données actuelle();
column_names = dt << Get Column Names(numeric,String);
for(i=3,i<=NItems(column_names),i++,
nomCol = noms_colonnes ;
cmd = Expr(
ow = dt << Répartition(
Distribution continue( Colonne( cName ) ),
Où( :SEXE == "F" )
);
owr = ow<
);
Substituer dans(cmd,Expr(cName),colName);
Éval(cmd);
);
Journal actuel() << Enregistrer HTML(".....\test.htm");
Maintenant, lorsque je l'exécute, j'obtiens un message d'erreur dans la fenêtre du journal "Une ou plusieurs colonnes n'ont que des valeurs manquantes.".
J'ai certaines colonnes dans lesquelles toutes les valeurs ou uniquement celles pour un "SEXE" spécifique manquent de données. Comment pourrais-je le vérifier dans ma boucle et les ignorer dans l'analyse ?
Merci
Re : Comment gérer les données manquantesChère Madame,
Ce dernier script a parfaitement fonctionné. J'ai beaucoup appris dans cette discussion.
Merci encore pour tous vos conseils.
Re : Comment gérer les données manquantesLa pile n'est qu'une étape intermédiaire pour organiser les données dans une seule colonne. L'erreur peut être que les colonnes d'étiquettes ou de données n'obtiennent pas les noms "Position" et "Données" que la commande de résumé assume ici. Supprimez l'option "invisible" et regardez la table empilée pour voir les noms de colonne, et modifiez le résumé en conséquence si quelque chose n'est pas nommé comme prévu (comme indiqué dans le commentaire jsl au-dessus de l'argument Stacked Data Column ("Data") semble être ignoré dans JMP 10 si les colonnes sont regroupées comme dans votre tableau d'origine, d'où la commande de dégroupage dans mon exemple ci-dessus).
Au lieu de pile, si cela se comporte mal, vous pouvez à la place utiliser le résumé et la transposition en tandem pour obtenir un résultat similaire. Essayez l'exemple ci-dessous (fonctionne avec le tableau affiché "Example") .
dt = Tableau de données ( "Exemple" ) ;
noms_colonnes = dt << Obtenir les noms de colonne ( numérique ) ;
( dt << Résumé (
Groupe ( : SEXE ) ,
Moyenne ( Éval ( noms_colonnes ) ) ,
format du nom de la colonne de statistiques ( "colonne" )
)) << Transposer ( Étiqueter ( : SEXE ) , Tableau de sortie ( "Résultat" ) ) ;
Re : Comment gérer les données manquantesChère Madame,
Merci beaucoup d'avoir proposé cette nouvelle méthode. Je pense que c'est plus rapide et plus efficace. Cependant, lorsque j'exécute le script, j'obtiens une erreur comme suit :
Colonne introuvable dans l'accès ou l'évaluation de "Bad Argument"
Send Attend un objet scriptable lors de l'accès ou de l'évaluation de 'Send' , dt_stacked << Summary( Group( :Position ), Mean( :Data ), Subgroup( :SEX ) )
Dans le script suivant, erreur marquée par /*###*/
::dt = Table de données( "Exemple" );
::column_names = ::dt << Obtenir les noms de colonne (numérique);
::dt_stacked = ::dt << Pile(
colonnes ( :: noms_colonnes ),
Colonne d'étiquette source( "Position" ),
Colonne de données empilées( "Données" ),
invisible
);
::dt_sum = ::dt_stacked << /*###*/Résumé(
Groupe( :Position ),
Moyenne( :Données ),
Sous-groupe ( : SEXE )
) /*###*/;
Colonne( 3 ) << set name( "Femme" );
Column( 4 ) << set name( "male" );
dt_sum << New Column( "Ratio", Formula( Female / Male ) );
dt_stacked << fermer la fenêtre ;
Il semble que quelque chose ne va pas dans la création de la pile. Avez-vous une idée de la raison pour laquelle une telle erreur s'est produite?
Merci encore pour toutes vos aides.
Re : Comment gérer les données manquantesJe ne reçois pas ce message si j'applique le script à l'exemple de table publié ci-dessus. Cependant, owr[NumberColBox(4)] ; donne une erreur car il n'existe pas. Jusqu'à présent, le code ne donne que des résultats pour "F" et non pour "M" que je suppose que vous souhaitez également répertorier dans le tableau des résultats.
Si votre seul objectif est de résumer, j'utiliserais la fonction Summary () au lieu de parcourir de nombreux rapports de distribution.
Un exemple:
dt = Tableau de données ( "Exemple" ) ;
noms_colonnes = dt << Obtenir les noms de colonne ( numérique ) ;
dt << Dissocier les colonnes ( noms_colonnes ) ; // Apparaît un bogue dans JMP 10 avec le nom de la colonne de données empilées et les colonnes groupées
dt_stacked = dt << Empiler (
Colonnes ( noms_colonnes ) ,
Colonne d'étiquette de source ( "Position" ) ,
Colonne de données empilées ( "Données" ) ,
invisible
) ;
somme_dt = dt_stacked << Résumé (
Groupe ( : Position ) ,
Moyenne ( : Données ) ,
Sous-groupe ( : SEXE )
) ;
Colonne ( 3 ) << définir le nom ( "Femme" ) ;
Colonne ( 4 ) << définir le nom ( "homme" ) ;
somme_dt << Nouvelle colonne ( "Rapport" , Formule ( Femme / Homme ) ) ;
dt_stacked << Fermer la fenêtre ;
Re : Comment gérer les données manquantesJ'ai changé les scripts comme suit :
dt = table de données("Exemple") ;
column_names = dt << Get Column Names(numeric,String);
résultats = Nouveau Tableau("Résultats", visible,
Nouvelle Colonne("Position", caractère),
Nouvelle colonne("Femme", numérique),
Nouvelle colonne("Homme", numérique),
Nouvelle colonne("Ratio", Formule(Femme/Homme)),
Ajouter des lignes (NItems (noms_colonnes))
);
for(i=1,i<=NItems(column_names),i++,
If( N Row( dt << get rows where( And( :SEX[] == "F", !Is Missing( Column( column_names )[] ) ) ) ),
nomCol = noms_colonnes ;
cmd = Expr(
ow = dt << Distribution( Distribution continue( Colonne( cName ) ),
Où( :SEXE == "F" ) );
owr = ow<
allmean= owr[NumberColBox(2)] ;
Fmoy = allmean[1] ;
allmean1= owr[NumberColBox(4)] ;
Mmean = allmean1[1] ;
Colonne(résultats,1) = colName ;
Colonne(résultats,2) = Fmoyen ;
Colonne(résultats,3) = Mmean ;
ow << Fermer la fenêtre ;
);
Remplacez Into( cmd, Expr( cName ), colName );
Eval( cmd );
)
);
résultats << journal;
Maintenant, je reçois ce message dans la fenêtre du journal
"Impossible de trouver la colonne{1}
dans l'accès ou l'évaluation de 'Column' , Column( column_names )"
et il fait référence à cette ligne :
":SEX[] == "F" & !Is Missing( Column/*###*/(::column_names[::i])[] )"
Merci pour les conseils
Re : Comment gérer les données manquantesJe pense que l'erreur est causée par égaré
dt = table de données actuelle()
Il attribue la nouvelle table "Results" plutôt que votre table d'origine à dt . Et les résultats n'ont pas de colonne nommée :SEX
Essayez dt = data table("Exemple") à la place.
Re : Comment gérer les données manquantesChère Madame,
Merci pour vos conseils. J'ai ajouté vos suggestions de codes et j'ai modifié mon script pour exporter les résultats vers un tableau comme suit :
résultats = Nouveau Tableau("Résultats", visible,
Nouvelle Colonne("Position", caractère),
Nouvelle colonne("Femme", numérique),
Nouvelle colonne("Homme", numérique),
Nouvelle colonne("Ratio", Formule(Femme/Homme)),
Ajouter des lignes (NItems (noms_colonnes))
);
dt = table de données actuelle();
column_names = dt << Get Column Names(numeric,String);
for(i=1,i<=NItems(column_names),i++,
If( N Row( dt << get rows where( And( :SEX[] == "F", !Is Missing( Column( column_names )[] ) ) ) ),
nomCol = noms_colonnes ;
cmd = Expr(
ow = dt << Distribution( Distribution continue( Colonne( cName ) ),
Où( :SEXE == "F" ) );
owr = ow<
allmean= owr[NumberColBox(2)] ;
Fmoy = allmean[1] ;
allmean1= owr[NumberColBox(4)] ;
Mmean = allmean1[1] ;
Colonne(résultats,1) = colName ;
Colonne(résultats,2) = Fmoyen ;
Colonne(résultats,3) = Mmean ;
ow << Fermer la fenêtre ;
);
Remplacez Into( cmd, Expr( cName ), colName );
Eval( cmd );
)
);
résultats << journal;
Maintenant, quand je l'exécute, cela me donne une erreur pour SEX. J'ai joint un exemple de mon fichier de données pour test.
Merci d'avance pour votre aide.
Re : Comment gérer les données manquantesIl y a plusieurs façons de le faire (comme d'habitude). Vous trouverez ci-dessous une approche qui devrait fonctionner.
dt = Tableau de données actuel () ;
noms_colonnes = dt << Obtenir les noms de colonne ( numérique , Chaîne ) ;
Pour ( je = 3 , je <= N articles ( noms_colonnes ) , je ++,
// si non manquant dans la colonne i où SEX="F" > 0, faire des trucs, sinon i suivant
Si ( N rangée ( dt << obtenir des lignes où ( Et ( : SEXE [] == "F" , ! Est manquant ( Colonne ( noms_colonnes [ je ] )[] ) ) ) ) ,
colName = noms_colonnes [ je ] ;
commande = Expr (
aïe = dt << Distribution ( Distribution continue ( Colonne ( cName ) ) , Où ( : SEXE == "F" ) ) ;
aie = aïe << rapport ;
) ;
Remplacer dans ( commande , Expr ( cName ) , colName ) ;
Éval ( commande ) ;
)
) ;
Journal actuel () << Enregistrer le HTML ( ".....\test.htm" ) ;