Enregistrer les estimations des paramètres de la régression linéaire avec par variableJ'essaie de faire une régression linéaire de 2 colonnes regroupées par une 3ème colonne et je suis bloqué. Je veux une colonne avec une pente pour cette ligne et une autre avec une intersection pour cette ligne.
Bref historique :
J'ai 30 000 formulations différentes qui ont chacune été testées avec 13 niveaux différents d'acide. Je veux comprendre la pente du pH en fonction de la concentration en acide. Pour ma gamme (et mon objectif), je peux le faire comme une régression linéaire.
Mon tableau de données est configuré comme celui-ci, mais avec 30 000 formules combinées et 13 niveaux d'acide pour un total de 390 000 lignes.
| Formule |
Niveau d'acide |
pH |
|---|
ComboA
|
5 |
6.7 |
| ComboB |
5 |
6,75 |
| ComboC |
5 |
6.5 |
| ComboA |
dix |
6.4 |
| ComboB |
dix |
6h45 |
Je sais que je peux les tracer dans Fit Y by X, regrouper les données, puis ajouter des ajustements linéaires, mais cela 1) prend une éternité avec 30 000 groupes et 2) est pénible pour extraire les pentes de ce rapport.
J'ai actuellement divisé mon tableau par "Niveau d'acide", en divisant le "pH" et en conservant la "Formule". Je sais que j'ai quelque chose comme ça et je veux un moyen de remplir les 2 colonnes de droite.
| Formule |
ph 5 |
ph 10 |
ph 15 |
ph 20 |
Pente |
Intercepter |
|---|
| ComboA |
données |
données |
données |
données |
|
|
| ComboB |
données |
données |
données |
données |
|
|
| ComboC |
données |
données |
données |
données |
|
|
La première préférence consiste à utiliser une formule. Si j'ai besoin de faire un script, je peux le faire aussi.
Merci
Re : Régression linéaire d'un ensemble de données par une colonne<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai trouvé la façon suivante de calculer l'expression.
SS_TOT = Somme ( i = 1, N Ligne ( dt1 ), (Colonne ( dt1, k ) - un moyen pour) ^ 2 / N Ligne( dt1 ) );
mais le calcul est fait pour toute la colonne "k".
Avez-vous une idée sur la façon dont je pourrais inclure une séparation de groupe ?
SS_TOT[gp#1] / SS_TOT[gp#2] ...
Re : Régression linéaire d'un ensemble de données par une colonneje reviens sur ce sujet.
Je comprends toute la manipulation et peux l'appliquer à mes données mais je suis toujours très flou sur la partie suivante :
bêta = J(ng, 2, .);
pour (g=1, g <= ng, g++,
thisGroup = Loc(groupID == g);
beta[g, 0] = Transpose(Inv(xVals[thisGroup, 0]`*xVals[thisGroup, 0])*xVals[thisGroup, 0]`*yVals[thisGroup]);
);
pas capable de comprendre ce qui se passe sauf qu'une matrice bêta est créée et toutes les données sont remplacées dans une nouvelle table...
pourriez-vous s'il vous plaît m'aider à comprendre ce point ?
Re : Régression linéaire d'un ensemble de données par une colonneje vais le vérifier compte tenu de votre dernier commentaire. Merci Ian
Re : Régression linéaire d'un ensemble de données par une colonneUne fois que vous avez les coefficients ajustés pour chaque groupe (comme ci-dessus), vous pouvez obtenir les valeurs prédites, et donc les résidus et la somme des carrés résiduelle (pour chaque groupe). La somme totale des carrés (pour chaque groupe) est également simple, vous avez donc tout le nécessaire pour obtenir R au carré (pour chaque groupe).
Gardez cependant à l’esprit qu’à mesure que vous ajoutez plus de manipulations au JSL, cela prendra plus de temps (bien que dans ce cas, cela reste plus rapide que l’utilisation de la plate-forme). Bien sûr, quelqu’un doit aussi écrire et valider le code !
Re : Régression linéaire d'un ensemble de données par une colonneIan
merci c'est une belle approche avec la matrice.
est-ce qu'il y a un moyen d'obtenir le Rsquare également ?
Re : Régression linéaire d'un ensemble de données par une colonnePar coïncidence, j'étais sur le point de souligner que si vous savez que vous avez besoin d'une régression linéaire et que vous ne voulez que les paramètres, alors JSL est beaucoup plus rapide. Le code ci-dessous a pris environ 100 secondes sur mon ordinateur portable.
NomsDefaultToHere ( 1 ) ;
// Crée des données groupées
GS = dix ; // Taille de groupe
ng = 30000 ; // Nombre de groupes
ID de groupe = Trier par ordre croissant ( Répéter (( 1 :: ng ) ', GS )) ;
xValeurs = J. ( NRangée ( ID de groupe ) , 1 , AléatoireNormal ()) ;
yVals = J. ( NRangée ( ID de groupe ) , 1 , AléatoireNormal ()) ;
// Mettre les données dans un tableau
dt1 = NouveauTableau ( "Données de régression groupées" ,
NouvelleColonne ( "Groupe" , Numérique , Nominal , Valeurs ( ID de groupe )) ,
NouvelleColonne ( "X" , Numérique , Continu , Valeurs ( xValeurs )) ,
NouvelleColonne ( "oui" , Numérique , Continu , Valeurs ( yVals )) ,
) ;
// Décommentez ce bloc pour utiliser Fit Y By X pour effectuer l'ajustement
/*
// Utiliser Ajuster Y par X
fxy = dt1 << Bivarié(Y( :y ), X( x ), Ajuster la ligne( {Couleur de la ligne( {208, 64, 86} )} ), Par(:Groupe));
// Récupère les paramètres ajustés dans un tableau
// (Pour ce faire de manière interactive, cliquez avec le bouton droit sur n'importe quel tableau d'estimations de paramètres dans le rapport et sélectionnez « Créer un tableau de données combinées »)
fxyRep = fxy << Rapport ;
dt2 = fxyRep[1][TableBox(3)] << makeCombinedDataTable;
// Diviser dt2
dt3 = dt2 << Split(Split By( :Term ), Split( :Estimate ), Group( :Group ), Colonnes restantes (Tout supprimer ));
dt3 << setName("Estimations des paramètres à partir de l'ajustement Y par X");
Fermer (dt2, noSave);
*/
/// Faire la régression linéaire en JSL en contournant la plateforme . . .
// (1) Récupère les données de la table
xValeurs = Colonne ( dt1 , "X" ) << obtenirEn tant queMatrix ;
yVals = Colonne ( dt1 , "oui" ) << obtenirEn tant queMatrix ;
ID de groupe = Colonne ( dt1 , "Groupe" ) << obtenirEn tant queMatrix ;
// (2) Ajouter le vecteur unitaire à la matrice de conception
xValeurs = J. ( NRangée ( xValeurs ) , 1 , 1 ) || xValeurs ;
// (3) Effectuer la régression linéaire pour chaque groupe et stocker les résultats
bêta = J. ( ng , 2 , . ) ;
pour ( g = 1 , g <= ng , g ++,
ce groupe = Lieu ( ID de groupe == g ) ;
bêta [ g , 0 ] = Transposer ( Inv. ( xValeurs [ ce groupe , 0 ] `* xValeurs [ ce groupe , 0 ]) * xValeurs [ ce groupe , 0 ] `* yVals [ ce groupe ]) ;
) ;
// (4) Faire le tableau des résultats
dt4 = CommeTable ( bêta ) ;
dt4 << setName ( "Estimations des paramètres de JSL" ) ;
Colonne ( dt4 , "Col1" ) << setName ( "Intercepter" ) ;
Colonne ( dt4 , "Col2" ) << setName ( "X" ) ;
Re : Régression linéaire d'un ensemble de données par une colonneLe scénario de Peter vous sera très utile.Cependant, pour référence, si vous deviez faire cela par JMP plutôt que par JSL (c'est souvent un problème de temps selon s'il s'agit d'une analyse unique ou non), alors si vous ajustez votre y-by-x, vous pouvez " diffusez" votre ligne d'ajustement, allez prendre une tasse de café si nécessaire, puis lorsque JMP a fini de fonctionner, faites un clic droit sur l'un des tableaux d'estimation des paramètres et sélectionnez "créer un tableau de données combinées" pour obtenir un tableau avec les estimations.Voilà comment exécuter le script de Peter sans le script.
Re : Régression linéaire d'un ensemble de données par une colonneJ'ai obtenu la plupart du code pertinent de la publication de Ian Cox ici .Cela effectuera l'analyse, puis mettra toutes les pentes et intersections dans un tableau.
dt = Nouveau tableau ( "Exemples de données" , Ajouter des lignes ( 6 ) ,
Nouvelle colonne ( "Formule" , Personnage , Nominal ,
Définir les valeurs ( { "ComboA" , "ComboC" , "ComboB" , "ComboC" , "ComboA" , "ComboB" } )
) ,
Nouvelle colonne ( "Niveau d'acide" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 5 , 15 , 5 , 5 , dix , dix ] )
) ,
Nouvelle colonne ( "pH" , Numérique , Continu , Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 6.7 , 4.8 , 6,75 , 6.5 , 6.4 , 6h45 ] )
)
) ;
// Exécuter Ajuster Y par X
bv = dt << Bivarié (
Oui ( : pH ) ,
X ( : Niveau d'acide ) ,
Ligne d'ajustement ( { Couleur de la ligne ( { 213 , 72 , 87 } )} ) ,
Par ( : Formule )
) ;
// Une référence à la couche rapport : bivREp est aussi une liste
bivRep = bv << Rapport ;
// 'Créer une table de données combinées' évite d'avoir à envoyer un message à chaque élément de 'bivRep'
dt2 = bivRep [ 1 ] [ TableBox ( 3 )] << Créer un tableau de données combiné ;
Ré: Régression linéaire d'un ensemble de données par colonneL'exécution de JSL est très utile pour les grands ensembles de données et un grand nombre d'ID de groupe. Existe-t-il un moyen d'itérer sur un ID de groupe non numérique ?
Et bien sûr, il faut une colonne pour stocker également le GroupID non numérique.