Salva le stime dei parametri della regressione lineare con per variabileSto cercando di eseguire una regressione lineare di 2 colonne raggruppate da una terza colonna e sono bloccato. Voglio una colonna con pendenza per quella riga e un'altra con intercetta per quella riga.
Breve contesto:
Ho 30.000 formulazioni diverse, ciascuna testata con 13 diversi livelli di acido. Voglio capire la pendenza del pH in funzione della concentrazione di acido. Per il mio intervallo (e scopo) posso farlo come una regressione lineare.
La mia tabella dati è impostata in questo modo, ma con 30.000 combinazioni di formule e 13 livelli di acido per un totale di 390.000 righe.
| Formula |
Livello di acidità |
pH |
|---|
CombinatoA
|
5 |
6.7 |
| ComboB |
5 |
6,75 |
| ComboC |
5 |
6.5 |
| CombinatoA |
10 |
6.4 |
| ComboB |
10 |
6.45 |
So che posso tracciarli in Adatta Y per X, raggruppare i dati e quindi aggiungere adattamenti lineari, ma 1) impiega un'eternità con gruppi da 30k e 2) è una seccatura estrarre le pendenze da quel rapporto
Al momento ho diviso la mia tabella per "Livello acido", dividendo "pH" e mantenendo "Formula". So che ho qualcosa del genere e voglio un modo per riempire le 2 colonne giuste.
| Formula |
f 5 |
pH 10 |
ph 15 |
pH 20 |
Pendenza |
Intercettare |
|---|
| CombinatoA |
dati |
dati |
dati |
dati |
|
|
| ComboB |
dati |
dati |
dati |
dati |
|
|
| ComboC |
dati |
dati |
dati |
dati |
|
|
La prima preferenza ha a che fare con una formula. Se ho bisogno di fare una sceneggiatura, posso farlo anche io.
Grazie
Re: Regressione lineare del set di dati per colonna<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho trovato il seguente modo per calcolare l'espressione.
SS_TOT = Somma ( i = 1, N riga ( dt1 ), (colonna ( dt1, k ) - un significato) ^ 2 / N riga( dt1 ) );
ma il calcolo viene effettuato per tutta la colonna "k".
Qualche suggerimento su come potrei includere una separazione di gruppo?
SS_TOT[gp#1] / SS_TOT[gp#2] ...
Re: Regressione lineare del set di dati per colonnatornando su questo argomento.
Comprendo tutta la manipolazione e posso applicarmi ai miei dati, ma sono ancora molto poco chiaro sulla parte seguente:
beta = J(ng, 2, .);
per (g=1, g <= ng, g++,
thisGroup = Loc(groupID == g);
beta[g, 0] = Transpose(Inv(xVals[questoGruppo, 0]`*xVals[questoGruppo, 0])*xVals[questoGruppo, 0]`*yVals[questoGruppo]);
);
non sono in grado di capire cosa sta succedendo, tranne che viene creata una matrice beta e tutti i dati vengono sostituiti in una nuova tabella...
potreste per favore aiutarmi a capire questo punto?
Re: Regressione lineare del set di dati per colonnalo controllerò considerando il tuo ultimo commento. Grazie Ian
Re: Regressione lineare del set di dati per colonnaUna volta ottenuti i coefficienti adattati per ciascun gruppo (come sopra), è possibile ottenere i valori previsti, e quindi i residui e la somma residua dei quadrati (per ciascun gruppo). Anche la somma totale dei quadrati (per ciascun gruppo) è facile, quindi hai tutto il necessario per ottenerlo R quadrato (per ogni gruppo).
Tieni presente, tuttavia, che aggiungendo più manipolazioni al JSL ci vorrà più tempo (anche se in questo caso ancora più veloce rispetto all'utilizzo della piattaforma). Ovviamente qualcuno deve anche scrivere e convalidare il codice!
Re: Regressione lineare del set di dati per colonnaIan
grazie, è un bell'approccio con Matrix.
c'è un modo per ottenere anche Rsquare?
Re: Regressione lineare del set di dati per colonnaPer coincidenza, stavo per sottolineare che, se sai di aver bisogno della regressione lineare e vuoi solo i parametri, allora JSL è molto più veloce. Il codice seguente ha richiesto circa 100 secondi sul mio laptop.
NomiDefaultToHere ( 1 ) ;
// Crea alcuni dati raggruppati
g = 10 ; // Dimensione del gruppo
ng = 30000 ; // Numero di gruppi
ID gruppo = Ordine crescente ( Ripetere (( 1 :: ng ) ", g )) ;
xVals = J ( NRow ( ID gruppo ) , 1 , CasualeNormale ()) ;
yVals = J ( NRow ( ID gruppo ) , 1 , CasualeNormale ()) ;
// Inserisci i dati in una tabella
dt1 = Nuova tabella ( "Dati di regressione raggruppati" ,
Nuova colonna ( "Gruppo" , Numerico , Nominale , Valori ( ID gruppo )) ,
Nuova colonna ( "X" , Numerico , Continuo , Valori ( xVals )) ,
Nuova colonna ( "y" , Numerico , Continuo , Valori ( yVals )) ,
) ;
// Decommenta questo blocco per utilizzare Adatta Y per X per eseguire l'adattamento
/*
// Usa Adatta Y per X
fxy = dt1 << Bivariata(Y( :y ), X( x ), Adatta linea( {Colore linea( {208, 64, 86} )} ), Per(:Gruppo));
// Ottiene i parametri inseriti in una tabella
// (Per eseguire questa operazione in modo interattivo, fare clic con il pulsante destro del mouse su qualsiasi tabella di stima dei parametri nel report e selezionare "Crea tabella dati combinata")
fxyRep = fxy << Rapporto;
dt2 = fxyRep[1][TableBox(3)] << makeCombinedDataTable;
// Dividi dt2
dt3 = dt2 << Dividi(Dividi per( :Termine ), Dividi( :Stima ), Gruppo( :Gruppo ), Colonne rimanenti( Elimina tutto ));
dt3 << setName("Stime dei parametri da Adatta Y per X");
Chiudi(dt2, noSalva);
*/
/// Esegue la regressione lineare in JSL, bypassando la piattaforma. . .
// (1) Ottieni i dati dalla tabella
xVals = Colonna ( dt1 , "X" ) << getAsMatrix ;
yVals = Colonna ( dt1 , "y" ) << getAsMatrix ;
ID gruppo = Colonna ( dt1 , "Gruppo" ) << getAsMatrix ;
// (2) Aggiungere il vettore unitario alla matrice di progetto
xVals = J ( NRow ( xVals ) , 1 , 1 ) || xVals ;
// (3) Eseguire la regressione lineare per ciascun gruppo e memorizzare i risultati
beta = J ( ng , 2 , . ) ;
per ( G = 1 , G <= ng , G ++,
questo gruppo = Loc ( ID gruppo == G ) ;
beta [ G , 0 ] = Trasporre ( Inv ( xVals [ questo gruppo , 0 ] `* xVals [ questo gruppo , 0 ]) * xVals [ questo gruppo , 0 ] `* yVals [ questo gruppo ]) ;
) ;
// (4) Crea la tabella dei risultati
dt4 = Come tabella ( beta ) ;
dt4 << imposta nome ( "Stime dei parametri da JSL" ) ;
Colonna ( dt4 , "Col1" ) << imposta nome ( "Intercettare" ) ;
Colonna ( dt4 , "Col2" ) << imposta nome ( "X" ) ;
Ri: Regressione lineare del set di dati per colonnaLa sceneggiatura di Peter ti sarà utile.Tuttavia, per riferimento, se dovessi farlo con JMP anziché con JSL (spesso è una questione di tempo in termini di tempo a seconda se si tratta di un'analisi una tantum o meno), quindi se adatti il tuo y-by-x puoi " trasmetti" la tua linea di adattamento, vai a prendere una tazza di caffè se necessario, quindi una volta terminato l'esecuzione di JMP, fai clic con il pulsante destro del mouse su una delle tabelle di stima dei parametri e seleziona "crea tabella dati combinata" per ottenere una tabella con le stime.Ecco come eseguire lo script di Peter senza lo script.
Ri: Regressione lineare del set di dati per colonnaHo ottenuto la maggior parte del codice rilevante dal post di Ian Cox Qui .Questo eseguirà l'analisi e quindi inserirà tutte le pendenze e le intercettazioni in una tabella.
dt = Nuova tabella ( "Dati campione" , Aggiungi righe ( 6 ) ,
Nuova colonna ( "Formula" , Carattere , Nominale ,
Imposta valori ( { "ComboA" , "ComboC" , "ComboB" , "ComboC" , "ComboA" , "ComboB" } )
) ,
Nuova colonna ( "Livello di acidità" , Numerico , Continuo , Formato ( "Migliore" , 12 ) ,
Imposta valori ( [ 5 , 15 , 5 , 5 , 10 , 10 ] )
) ,
Nuova colonna ( "pH" , Numerico , Continuo , Formato ( "Migliore" , 12 ) ,
Imposta valori ( [ 6.7 , 4.8 , 6,75 , 6.5 , 6.4 , 6.45 ] )
)
) ;
// Esegui Adatta Y per X
bv = dt << Bivariato (
Y ( : pH ) ,
X ( : Livello di acidità ) ,
Linea adatta ( { Colore della linea ( { 213 , 72 , 87 } )} ) ,
Di ( : Formula )
) ;
// Un riferimento al livello del report: bivREp è anche un elenco
bivRep = bv << Rapporto ;
// 'Crea tabella dati combinata' evita di dover inviare un messaggio a ciascun elemento in 'bivRep'
dt2 = bivRep [ 1 ] [ TabellaBox ( 3 )] << Crea tabella dati combinata ;
Re: Regressione lineare di un set di dati per colonnaEseguire JSL è molto utile per grandi set di dati e un numero elevato di #groupID. Esiste un modo per iterare su groupID non numerici.
E naturalmente è necessaria anche una colonna per memorizzare il GroupID non numerico.