Sto cercando di automatizzare il mio script di degrado in modo da poter utilizzare lo stesso script per adattare un modello di degrado a dati diversi.
Attualmente sono riuscito ad adattare il modello che desidero ai miei dati utilizzando Fit Model e ho ottenuto i parametri come matrice di colonne.
Ho quindi provato a inserire la matrice nei valori iniziali per il modello di degradazione, ma emette semplicemente il modello con tutti i parametri invariati. C'è un modo per inserire una matrice come valori dei parametri, valori iniziali nello script di seguito, nello script di degradazione.
Degradation(
Y( :"Output/mV"n ),
Time( :Time in hours ),
Label( :Unit ID ),
Application( Repeated Measures Degradation ),
Connect Data Markers( 1 ),
Show Fitted Lines( 1 ),
Show Spec Limits( 1 ),
Show Median Curves( 0 ),
Show Legend( 0 ),
No Tab List( 0 ),
Set Upper Spec Limit( . ),
Set Lower Spec Limit( . ),
Set Censoring Time( . ),
Show Residual Plot( 1 ),
Show Inverse Prediction Plot( 1 ),
Inverse Prediction Interval( No Interval ),
Inverse Prediction Alpha( 0.05 ),
Path Specifications(
Nonlinear Path(
Add Formula(
Formula Name( "Model" ),
Formula(
Parameter(
{a = 200, b = -0.00007},
a[Unit ID] * Exp( b[Unit ID] * Time in hours )
),
),<BR />//Trying to enter my matrix of parameters into the model
Initial Values(A_para),
Fitting Method( QuasiNewton BFGS ),
),
Select Formula( "Model" )
),
Run Model( "Model" )
),
Nonlinear Path( 1 ),
Mean Path( 1 ),
SendToReport(
Dispatch(
{"Overlay", "Output/mV Residuals by Time in hours"},
"7",
ScaleBox,
{Min( -80 ), Max( 210 ), Inc( 50 ), Minor Ticks( 4 )}
),
Dispatch(
{"Overlay", "Output/mV Residuals by Time in hours"},
"13",
ScaleBox,
{Min( -80 ), Max( 210 ), Inc( 50 ), Minor Ticks( 4 )}
),
Dispatch(
{"Overlay", "Model Specification"},
"Empty",
TextEditBox,
{Fixed Size( 1, 100, 19 ), Set Text( "Model" )}
),
)
);obj = Fit Curve(
Y( :"Output/mV"n ),
X( :Time in hours ),
Group( :Unit ID ),
);
//Currently this is using a slighlty different fitting method to the one used by the degredation platform
obj << Fit Exponential 2P;
//Next I want to create the table of parameter estimates
dt_p = obj << (Fit[1] << Make Parameter Table);
//Now create a single column matrix of the parameter estimates
col_scale = Column( dt_p, "Scale" );
col_growth = Column( dt_p, "Growth Rate" );
A_scale = col_scale << Get As Matrix;
A_growth = col_growth << Get As Matrix;
A_para = A_scale |/ A_growth;
//Put values into a column to check I've done it right
dt_temp = Data Table( "Stacked and Transposed New Dates Raw Data" );
col_p = dt_temp << New Column( "Parameters" );
col_p << Set Values(A_para);
Al momento, la piattaforma di degradazione non può accettare una variabile denominata di una matrice nel modo desiderato.
Una soluzione alternativa consiste nel costruire un'espressione, quindi valutare.
Supponiamo di avere già una matrice
A_para = [....];
che contiene i valori iniziali.
La soluzione alternativa consiste nel costruire un'espressione come la seguente
code = expr(Degradation(
Initial Values(
A_para
),
Fixed(
....
)
));
Ora sostituisci il nome A_para con la matrice effettiva, in questo modo:
substitute into(code, expr(A_para), A_para);
Infine, esegui il codice:
eval(code);
Se si desidera utilizzare l'immissione dei valori iniziali così com'è, credo che sia necessario assegnare una matrice di uno nella clausola Fixed.
Per favore fammi sapere come va.