cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Choose Language Hide Translation Bar
Jemster
Level III

Automating Degradation analysis

I am trying to automate my degradation script so that I can use the same script to fit a degradation model to different data.

I currently have managed to fit the model I want to my data using Fit Model and have got the parameters as a column matrix.

I then tried to Input the matrix into the Initial Values for the Degredation Model but it just outputs the model with all the parameters unchanged. Is there any way I can input a matrix as parameter values, Initial values in the script below, into the degredation script.

 

 

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 )
					),
				),
//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);

 

1 ACCEPTED SOLUTION

Accepted Solutions
peng_liu
Staff

Re: Automating Degradation analysis

At the moment, the degradation platform cannot take a named variable of a matrix like the way that you want.

A workaround is to construct an expression, then evaluate.

Suppose you already have an matrix

A_para = [....];

which holds initial values.

The workaround is to construct an expression like the following

code = expr(Degradation(
				Initial Values(
					A_para
				),
				Fixed(
					....
				)
));

Now swap out the name A_para by the actual matrix, like this:

substitute into(code, expr(A_para), A_para);

Finally, run the code by:

eval(code);

If you want to use the inputting initial values as is, I believe you need to assign an matrix of one's into the Fixed clause.

Please let me know how it goes.

View solution in original post

2 REPLIES 2
peng_liu
Staff

Re: Automating Degradation analysis

At the moment, the degradation platform cannot take a named variable of a matrix like the way that you want.

A workaround is to construct an expression, then evaluate.

Suppose you already have an matrix

A_para = [....];

which holds initial values.

The workaround is to construct an expression like the following

code = expr(Degradation(
				Initial Values(
					A_para
				),
				Fixed(
					....
				)
));

Now swap out the name A_para by the actual matrix, like this:

substitute into(code, expr(A_para), A_para);

Finally, run the code by:

eval(code);

If you want to use the inputting initial values as is, I believe you need to assign an matrix of one's into the Fixed clause.

Please let me know how it goes.

Jemster
Level III

Re: Automating Degradation analysis

Thank you, this worked perfectly