Sostituzione dei dati mancanti con valori regrediti<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />CIAO
Ho una serie temporale per la quale la variabile presenta valori mancanti. Vorrei sostituire i valori mancanti con un modello lineare derivato dai valori disponibili più vicini nel tempo.
Quale sarebbe il modo migliore?
E se lo script potesse farlo su tutte le colonne della mia tabella (tranne l'ora), sarebbe ancora meglio
Grazie
Esempio
Ciò che ho
| T | Produzione |
|---|
| 0 | 10 |
| 1 | . |
| 2 | . |
| 4 | 30 |
| 10 | . |
| 20 | 10 |
Quello che voglio:
| T | Produzione |
|---|
| 0 | 10 |
| 1 | 15 |
| 2 | 20 |
| 4 | 30 |
| 10 | 22.5 |
| 20 | 10 |
Ri: Sostituzione dei dati mancanti con valori regreditiIl modo in cui funzionano le formule JMP, insieme alle funzioni JMP, è che l'ultima variabile creata o a cui si fa riferimento è ciò che viene passata dalla formula o funzione. Pertanto, nella formula di sostituzione, ciò che viene restituito come valore delle righe è il valore della matrice "Valori" uguale al numero Row(). E poiché la matrice "Valori" è dove i valori delle colonne sono stati ottenuti con il messaggio << ottieni valori, e le interpolazioni sono state effettuate sulla matrice "Valori", specificando
valori[Riga()]
la formula sposta i valori una riga alla volta nella nuova colonna.
Un altro modo per spiegarlo è seguire il flusso del processo della formula
Tutte le formule passano in rassegna tutte le righe di una tabella dati dalla riga 1 all'ultima riga della tabella dati.
Durante l'elaborazione della riga 1, tutti i valori della colonna "p (g/L)" vengono spostati in una matrice per l'elaborazione. Cicli di elaborazione dall'elemento 1 nella matrice, fino alla fine della matrice, eseguendo interpolazioni quando necessario. Alla fine del ciclo tutti gli elementi della matrice sono compilati. Quindi il valore del primo elemento nella matrice "Valori" viene restituito alla formula come valore da utilizzare per la prima riga della colonna.
Quindi il valore della riga viene spostato per eseguire la formula per la 2a riga e le uniche istruzioni eseguite per la 2a riga sono
valori[Riga()]
che restituisce alla formula il valore della riga colonne 2, che è l'elemento 2 della matrice "Valori".
La formula continua il ciclo una volta per ogni riga successiva, eseguendo solo l'istruzione
valori{Riga()]
Spero che questo abbia sensoRi: Sostituzione dei dati mancanti con valori regreditiJim,
Grazie mille. funziona davvero bene adesso. puoi spiegarmi quali sono gli ultimi "values[Row()];" fa
Ri: Sostituzione dei dati mancanti con valori regreditiSe vuoi che il valore nella colonna Interpretato sia uguale a 0 ogni volta che il valore :Time è 0, una modifica al codice simile a quella seguente funzionerebbe
For( i = 1, i <= N Rows( values ), i++,
If( :Time[i] == 0, values[i]=0); // **************
If( Is Missing( values[i] ),
counter++,
If( counter > 0,
For( k = 1, k <= counter, k++,
base = values[i - counter - 1];
incr = Abs( (base - values[i]) / (counter + 1) );
If( base < values[i],
values[(i - counter - 1) + k] = base + k * incr,
values[(i - counter - 1) + k] = base - k * incr
);
);
counter = 0;
)
)
);Ri: Sostituzione dei dati mancanti con valori regreditiquesto lo fa per il primo valore, ma quello di cui ho bisogno è che tutto "Time" sia 0, il valore interpolato sia zero. la colonna dell'ora avrà più 0
Ri: Sostituzione dei dati mancanti con valori regreditiDal codice che ti ho fornito è questo quello che chiedi?
If( Is Missing( values[1] ),
values[1] = 0
);Ri: Sostituzione dei dati mancanti con valori regreditiJim,
Ho fatto funzionare la sceneggiatura. Ho dovuto aggiungere alcuni calcoli in modo da tenere conto del delta time sia per il calcolo dell'incremento che per il ciclo di valutazione dell'interpolazione. L'ultimo problema è che dal momento che sto pianificando di unire più file di esecuzione insieme ed eseguire lo script, avrò più punti in cui tempo = 0 (tempo: 0,12,24,48,0,12,24,48... ), quindi il primo valore interpolato dovrebbe essere 0 per il dato blocco di dati. Non sono sicuro di come farlo con la notazione matriciale.
Ri: Sostituzione dei dati mancanti con valori regreditiIn base alla mia esperienza, ho riscontrato troppi problemi durante il tentativo di fare riferimento alla colonna formula effettiva all'interno della formula. Pertanto, l'approccio mostrato. Ero anche preoccupato della tua formula dal punto di vista del numero di volte in cui esegui i dati con il tuo ciclo For(). Il mio metodo passa attraverso la tabella dati solo una volta... senza contare la sostituzione dell'iterazione.Ri: Sostituzione dei dati mancanti con valori regreditiJim,
Grazie mille, ci proverò. Sono curioso però; tornando allo script originale, pensavo che l'errore ricorsivo provenisse dalla riga 3, perché sarebbe andato a calcolare incr e avrebbe ottenuto righe-contatore-1 = 3-2-1 = 0. Ignorerei il messaggio di errore e interpola con successo il resto della colonna, tranne la fine.l'aggiunta di più dati alla tabella da interpolare riduce il problema. pensavo che potessero essere questioni separate.
Ri: Sostituzione dei dati mancanti con valori regreditiStai riscontrando un problema ricorsivo nella formula, quando provi a modificare i valori all'interno della colonna della formula stessa.Ho rielaborato la tua formula per eseguire tutto il lavoro in anticipo utilizzando una matrice.I valori risultanti vengono quindi utilizzati per i valori di ciascuna riga
Names Default To Here( 1 );
col_name_list = Current Data Table() << get column names( string );
If( !Contains( col_name_list, "Interpolated p (g/L)" ),
Current Data Table() << New Column( "Interpolated p (g/L)",
Numeric,
Continuous,
Formula(
dt = Current Data Table();
If( Row() == 1,
counter = 0;
values = dt:Name( "p (g/L)" ) << get values;
If( Is Missing( values[1] ),
values[1] = 0
);
counter = 0;
For( i = 1, i <= N Rows( values ), i++,
If( Is Missing( values[i] ),
counter++,
If( counter > 0,
For( k = 1, k <= counter, k++,
base = values[i - counter - 1];
incr = Abs( (base - values[i]) / (counter + 1) );
If( base < values[i],
values[(i - counter - 1) + k] = base + k * incr,
values[(i - counter - 1) + k] = base - k * incr
);
);
counter = 0;
)
)
);
);
values[Row()];
)
)
);Ri: Sostituzione dei dati mancanti con valori regreditiecco la tabella
Ri: Sostituzione dei dati mancanti con valori regreditiJim,
Grazie per aver chiarito Ho un problema con lo script. non eseguirà e interpolerà l'ultimo intervallo.non riesco a capire se ha qualcosa a che fare con l'annidamento dei loop o con le condizioni "mentre". sostanzialmente, indipendentemente dalla lunghezza della tabella, non è possibile riempire l'ultimo intervallo di dati mancanti.
col_name_list = Current Data Table() << get column names( string );
If( !Contains( col_name_list, "Interpolated p (g/L)" ),
Current Data Table() << New Column(
"Interpolated p (g/L)",
Numeric,
Continuous,
Formula(
If(
Is Missing( :Name( "time (h)" ) ),
Empty(),
:name( "time (h)" ) == 0,
0,
!Is Missing( :Name( "p (g/L)" ) ),
:name( "p (g/L)" ),
dt = Current Data Table();
For( rows = 1, rows <= (N Rows( dt )), rows++,
If( Rows == 1, counter = 0 );
If( Is Missing( dt:name( "Interpolated p (g/L)" )[rows] ) == 1,
counter++);
If( counter > 0 & Is Missing( dt:name( "Interpolated p (g/L)" )[rows] ) == 0,
incr = (dt:name( "Interpolated p (g/L)" )[Rows] - dt:name( "Interpolated p (g/L)" )[Rows - counter - 1]) / (dt
:name( "time (h)" )[Rows] - dt:name( "time (h)" )[Rows - counter - 1]);
For( i = rows - counter, i <= rows - 1, i++,
dt:name( "Interpolated p (g/L)" )[i] = dt:name( "Interpolated p (g/L)" )[i - 1] + (incr * (dt:name( "time (h)" )[i]
-dt:name( "time (h)" )[i - 1]))
);
counter = 0;
);
);
)
)
)
);
Ri: Sostituzione dei dati mancanti con valori regreditiJMP non fa distinzione tra maiuscole e minuscole nelle funzioni e nelle istruzioni, quindi righe=RigheRi: Sostituzione dei dati mancanti con valori regreditiJim,
c'è differenza tra "righe" e "righe"? potresti spiegarlo per favore? Sono un noob.
Ri: Sostituzione dei dati mancanti con valori regreditiBella cattura... dovrebbe essere
If this is row 1 initialize a variable named counter to 0
Ri: Sostituzione dei dati mancanti con valori regreditigrazie ha funzionato!hai commentato
If this is row 1 initialize a variable named counter to 1
, intendevi "contatore a 0"?
Ri: Sostituzione dei dati mancanti con valori regreditiEcco una versione aggiornata/annotata del mio codice originale.Tutto quello che dovresti fare è cambiare il nome della colonna da "Output" a qualunque sia il nome della colonna in cui desideri modificare i valori.
// Set all default referenced memory variables to this unique application
Names Default To Here( 1 );
// Set the variable dt to be a pointer to the current active data table
dt = Current Data Table();
// Loop through the data table from row 1 to the last row and use a
// variable names "rows" as the index
For( rows = 1, rows <= N Rows( dt ), rows++,
// If this is row 1 initialize a variable named counter to 1
If( Rows == 1, counter = 0 );
// If the current row's value for the column named "Output" in the
// data table referenced by "dt" is missing (blank, null) increase
// the counter
If( Is Missing( dt:output[rows] ) == 1,
counter++
);
// If row is found with a non missing value for the column called Output,
// and the counter is > 0, which indicates previous rows with missing
// values, then calculate the required values and place them in their
// appropriate rows
If( counter > 0 & Is Missing( dt:output[rows] ) == 0,
// Calculate the incremental steps to use for the missing cells
incr = (dt:output[Rows] - dt:output[Rows - counter - 1]) / (counter + 1);
// Loop across the rows with missing values and fill in the data
For( i = Rows - counter, i <= Rows - 1, i++,
dt:output[i] = dt:output[i - 1] + incr
);
// reinitialize the counter
counter = 0;
);
);Ri: Sostituzione dei dati mancanti con valori regredititxnelson,
potresti aggiornare lo script con i commenti? Sono nuovo in JSL e ho bisogno di aiuto per capire come si applica al mio problema. Ho la stessa esigenza di OP ma ho solo una colonna da compilare.in alternativa, in passato ho utilizzato il seguente codice VBA per inserire i dati mancanti in Excel. Mi chiedevo se esiste qualcosa di simile alla funzione End(xlDown).value in JSL. l'offset viene utilizzato per specificare dove si trovano i dati del punto temporale. Grazie!
Sub interpolatedata()
For Each cell In Range("k4:k29")
If cell.Value = "" Then
y2 = cell.End(xlDown).Value
x2 = cell.End(xlDown).Offset(0, -8).Value
y1 = cell.End(xlUp).Value
x1 = cell.End(xlUp).Offset(0, -8).Value
x = cell.Offset(0, -8).Value
y = (y1) + (x - x1) * (y2 - y1) / (x2 - x1)
cell.Value = y
End If
Next
Ri: Sostituzione dei dati mancanti con valori regreditiSpot sulla SM,
Saluti!
Ri: Sostituzione dei dati mancanti con valori regreditiHo avuto un problema simile alcuni anni fa e ho scritto uno script per eseguire l'imputazione tramite "regressione locale".
Ecco una versione aggiornata:
dt = Current Data Table();
n = N Rows(dt);
x = Column(1);// Column("t")
For(i = 2, i <= N Col(dt), i++,
y = Column(i);
For Each Row(
If(1 < Row() < n & Is Missing(y[]),
// find previous non-missing row
Eval(Eval Expr(r1 = Max(dt << get rows where(!Is Missing(y[]) & Row() < Expr(Row())))));
// find next non-missing row
Eval(Eval Expr(r2 = Min(dt << get rows where(!Is Missing(y[]) & Row() > Expr(Row())))));
y[] = y[r1] + (y[r2] - y[r1]) / (x[r2] - x[r1]) * (x[] - x[r1]);
)
)
);
Ri: Sostituzione dei dati mancanti con valori regreditiecco uno script che svolgerà il compito
Names Default To Here( 1 );
dt = Current Data Table();
For( rows = 1, rows <= N Rows( dt ), rows++,
If( Rows == 1, counter = 0 );
If( Is Missing( dt:output[rows] ) == 1,
counter = counter + 1,
If( counter > 0,
incr = (dt:output[Rows] - dt:output[Rows - counter - 1]) / (counter + 1);
For( i = Rows - counter, i <= Rows - 1, i++,
dt:output = dt:output[i - 1] + incr
);
counter = 0;
)
);
);
// Set all default referenced memory variables to this unique application
Names Default To Here( 1 );
// Set the variable dt to be a pointer to the current active data table
dt = Current Data Table();
// Loop through the data table from row 1 to the last row and use a
// variable names "rows" as the index
For( rows = 1, rows <= N Rows( dt ), rows++,
// If this is row 1 initialize a variable named counter to 1
If( Rows == 1, counter = 0 );
// If the current row's value for the column named "Output" in the
// data table referenced by "dt" is missing (blank, null) increase
// the counter
If( Is Missing( dt:output[rows] ) == 1,
counter++
);
// If row is found with a non missing value for the column called Output,
// and the counter is > 0, which indicates previous rows with missing
// values, then calculate the required values and place them in their
// appropriate rows
If( counter > 0 & Is Missing( dt:output[rows] ) == 0,
// Calculate the incremental steps to use for the missing cells
incr = (dt:output[Rows] - dt:output[Rows - counter - 1]) / (counter + 1);
// Loop across the rows with missing values and fill in the data
For( i = Rows - counter, i <= Rows - 1, i++,
dt:output[i] = dt:output[i - 1] + incr
);
// reinitialize the counter
counter = 0;
);
);Ri: Sostituzione dei dati mancanti con valori regreditiGrazie Ron ma non vedo nulla in questo che faccia interpolazione?
Ri: Sostituzione dei dati mancanti con valori regreditiprova questo per cominciare
Componente aggiuntivo di imputazione