Speichern Sie Parameterschätzungen der linearen Regression mit nach VariableIch versuche, eine lineare Regression von zwei Spalten durchzuführen, die durch eine dritte Spalte gruppiert sind, und stecke fest. Ich möchte eine Spalte mit Steigung für diese Zeile und eine weitere mit Achsenabschnitt für diese Zeile.
Kurzer Hintergrund:
Ich habe 30.000 verschiedene Formulierungen, die jeweils mit 13 verschiedenen Säurekonzentrationen getestet wurden. Ich möchte die Steigung des pH-Werts als Funktion der Säurekonzentration verstehen. Für meinen Bereich (und Zweck) kann ich dies als lineare Regression durchführen.
Meine Datentabelle ist wie folgt aufgebaut, jedoch mit 30.000 Formelkombinationen und 13 Säurestufen für insgesamt 390.000 Zeilen.
| Formel |
Säuregehalt |
pH-Wert |
|---|
ComboA
|
5 |
6.7 |
| ComboB |
5 |
6,75 |
| ComboC |
5 |
6.5 |
| ComboA |
10 |
6.4 |
| ComboB |
10 |
6.45 |
Ich weiß, dass ich sie in Fit Y by
Ich habe derzeit meine Tabelle nach „Säuregehalt“ aufgeteilt, „pH“ aufgeteilt und „Formel“ beibehalten. Ich weiß, dass ich so etwas habe und möchte eine Möglichkeit finden, die richtigen beiden Spalten auszufüllen.
| Formel |
PH 5 |
pH 10 |
PH 15 |
pH 20 |
Neigung |
Abfangen |
|---|
| ComboA |
Daten |
Daten |
Daten |
Daten |
|
|
| ComboB |
Daten |
Daten |
Daten |
Daten |
|
|
| ComboC |
Daten |
Daten |
Daten |
Daten |
|
|
Die erste Wahl ist die Verwendung einer Formel. Wenn ich ein Skript erstellen muss, kann ich das auch tun.
Danke
Betreff: Lineare Regression des Datensatzes nach einer Spalte<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich habe die folgende Möglichkeit gefunden, den Ausdruck zu berechnen.
SS_TOT = Summation( i = 1, N Row( dt1 ), (Column( dt1, k ) - a_mean) ^ 2 / N Row( dt1 ) );
Die Berechnung erfolgt jedoch für alle Spalten „k“.
Gibt es einen Hinweis, wie ich eine Gruppentrennung einbauen könnte?
SS_TOT[gp#1] / SS_TOT[gp#2] ...
Betreff: Lineare Regression des Datensatzes nach einer Spaltekomme mal wieder auf dieses Thema zurück.
Ich verstehe die ganze Manipulation und kann sie auf meine Daten anwenden, bin mir aber immer noch sehr unklar über den folgenden Teil:
Beta = J(ng, 2, .);
für (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]);
);
Ich kann nicht herausfinden, was passiert, außer dass eine Beta-Matrix erstellt und alle Daten in einer neuen Tabelle ersetzt werden ...
Könnten Sie mir bitte helfen, diesen Punkt zu verstehen?
Betreff: Lineare Regression des Datensatzes nach einer SpalteIch werde es unter Berücksichtigung Ihres letzten Kommentars überprüfen. Danke, Ian
Betreff: Lineare Regression des Datensatzes nach einer SpalteSobald Sie die angepassten Koeffizienten für jede Gruppe haben (wie oben), können Sie die vorhergesagten Werte und damit die Residuen und die Residualsumme der Quadrate (für jede Gruppe) erhalten. Die Gesamtsumme der Quadrate (für jede Gruppe) ist ebenfalls einfach, sodass Sie dann alles haben, was Sie brauchen R im Quadrat (für jede Gruppe).
Bedenken Sie jedoch, dass es länger dauert, je mehr Änderungen Sie an der JSL vornehmen (in diesem Fall jedoch immer noch schneller als bei Verwendung der Plattform). Natürlich muss auch jemand den Code schreiben und validieren!
Betreff: Lineare Regression des Datensatzes nach einer SpalteIan
Danke, das ist ein schöner Ansatz mit Matrix.
Gibt es eine Möglichkeit, auch den Rsquare zu bekommen?
Betreff: Lineare Regression des Datensatzes nach einer SpalteZufälligerweise wollte ich gerade darauf hinweisen, dass JSL viel schneller ist, wenn Sie wissen, dass Sie eine lineare Regression benötigen und nur die Parameter benötigen. Der folgende Code hat auf meinem Laptop etwa 100 Sekunden gedauert.
NamesDefaultToHere ( 1 ) ;
// Einige gruppierte Daten erstellen
gs = 10 ; // Gruppengröße
ng = 30000 ; // Anzahl der Gruppen
Gruppen-ID = Aufsteigend sortieren ( Wiederholen (( 1 :: ng ) `, gs )) ;
xVals = J ( NRow ( Gruppen-ID ) , 1 , ZufälligNormal ()) ;
yVals = J ( NRow ( Gruppen-ID ) , 1 , ZufälligNormal ()) ;
// Geben Sie die Daten in eine Tabelle ein
dt1 = NeueTabelle ( „Gruppierte Regressionsdaten“ ,
Neue Spalte ( "Gruppe" , Numerisch , Nominell , Werte ( Gruppen-ID )) ,
Neue Spalte ( "X" , Numerisch , Kontinuierlich , Werte ( xVals )) ,
Neue Spalte ( „y“ , Numerisch , Kontinuierlich , Werte ( yVals )) ,
) ;
// Entkommentieren Sie diesen Block, um Fit Y By X für die Anpassung zu verwenden
/*
// Y an X anpassen verwenden
fxy = dt1 << Bivariate(Y( :y ), X( x ), Fit Line( {Line Color( {208, 64, 86} )} ), By(:Group));
// Holen Sie sich die angepassten Parameter in eine Tabelle
// (Um dies interaktiv zu tun, klicken Sie mit der rechten Maustaste auf eine beliebige Tabelle mit Parameterschätzungen im Bericht und wählen Sie „Kombinierte Datentabelle erstellen“).
fxyRep = fxy << Report;
dt2 = fxyRep[1][TableBox(3)] << makeCombinedDataTable;
// dt2 teilen
dt3 = dt2 << Split(Split By( :Term ), Split( :Estimate ), Group( :Group ), Remaining Columns( Drop All ));
dt3 << setName("Parameterschätzungen aus der Anpassung von Y an X");
Close(dt2, noSave);
*/
/// Führen Sie die lineare Regression in JSL unter Umgehung der Plattform durch. . .
// (1) Holen Sie sich die Daten aus der Tabelle
xVals = Spalte ( dt1 , "X" ) << getAsMatrix ;
yVals = Spalte ( dt1 , „y“ ) << getAsMatrix ;
Gruppen-ID = Spalte ( dt1 , "Gruppe" ) << getAsMatrix ;
// (2) Füge den Einheitsvektor zur Designmatrix hinzu
xVals = J ( NRow ( xVals ) , 1 , 1 ) || xVals ;
// (3) Führen Sie die lineare Regression für jede Gruppe durch und speichern Sie die Ergebnisse
Beta = J ( ng , 2 , . ) ;
für ( G = 1 , G <= ng , G ++,
diese Gruppe = Ort ( Gruppen-ID == G ) ;
Beta [ G , 0 ] = Transponieren ( Inv ( xVals [ diese Gruppe , 0 ] `* xVals [ diese Gruppe , 0 ]) * xVals [ diese Gruppe , 0 ] `* yVals [ diese Gruppe ]) ;
) ;
// (4) Erstellen Sie die Ergebnistabelle
dt4 = AlsTabelle ( Beta ) ;
dt4 << Name einsetzen ( „Parameterschätzungen von JSL“ ) ;
Spalte ( dt4 , „Spalte1“ ) << Name einsetzen ( "Abfangen" ) ;
Spalte ( dt4 , „Spalte2“ ) << Name einsetzen ( "X" ) ;
Betreff: Lineare Regression des Datensatzes nach einer SpaltePeters Drehbuch wird Ihnen gute Dienste leisten.Als Referenz: Wenn Sie dies jedoch mit JMP und nicht mit JSL tun würden (es ist oft ein Zeitaufwand, je nachdem, ob es sich um eine einmalige Analyse handelt oder nicht), dann können Sie, wenn Sie Ihre y-mal-x-Analyse anpassen, „ Übertragen Sie Ihre Anpassungslinie, holen Sie sich bei Bedarf eine Tasse Kaffee. Wenn JMP mit der Ausführung fertig ist, klicken Sie mit der rechten Maustaste auf eine der Parameterschätzungstabellen und wählen Sie „Kombinierte Datentabelle erstellen“, um eine Tabelle mit den Schätzungen zu erhalten.So führen Sie Peters Skript ohne das Skript aus.
Betreff: Lineare Regression des Datensatzes nach einer SpalteDen größten Teil des relevanten Codes habe ich dem Beitrag von Ian Cox entnommen Hier .Dadurch wird die Analyse durchgeführt und anschließend alle Steigungen und Schnittpunkte in eine Tabelle eingetragen.
dt = Neuer Tisch ( "Beispieldaten" , Zeilen hinzufügen ( 6 ) ,
Neue Spalte ( "Formel" , Charakter , Nominell ,
Werte festlegen ( { „ComboA“ , „ComboC“ , „ComboB“ , „ComboC“ , „ComboA“ , „ComboB“ } )
) ,
Neue Spalte ( „Säuregehalt“ , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Werte festlegen ( [ 5 , 15 , 5 , 5 , 10 , 10 ] )
) ,
Neue Spalte ( „pH“ , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) ,
Werte festlegen ( [ 6.7 , 4.8 , 6,75 , 6.5 , 6.4 , 6.45 ] )
)
) ;
// Führen Sie „Y an X anpassen“ aus
bv = dt << Bivariat (
Y ( : pH-Wert ) ,
X ( : Säuregehalt ) ,
Linie anpassen ( { Linienfarbe ( { 213 , 72 , 87 } )} ) ,
Von ( : Formel )
) ;
// Ein Verweis auf die Berichtsschicht: bivREp ist auch eine Liste
bivRep = bv << Bericht ;
// „Kombinierte Datentabelle erstellen“ vermeidet, dass an jedes Element in „bivRep“ eine Nachricht gesendet werden muss.
dt2 = bivRep [ 1 ] [ TableBox ( 3 )] << Erstellen Sie eine kombinierte Datentabelle ;
Betreff: Lineare Regression eines Datensatzes nach einer SpalteDas Ausführen von JSL ist sehr nützlich für große Datensätze und eine große Anzahl von #groupIDs. Gibt es eine Möglichkeit, über nicht numerische groupIDs zu iterieren?
Und natürlich wird auch eine Spalte zum Speichern der nicht numerischen Gruppen-ID benötigt.