Voici une idée qui utilise Functional Data Explorer dans JMP Pro.FDE peut effectuer une décomposition de Fourier de manière simple et vous pouvez consulter les coefficients de base de Fourier pour voir si l'un d'entre eux semble inhabituel par rapport aux autres.
// find unusual signal trace idea
Names Default To Here( 1 );
// create some signal traces, with one trace that is different from the others
ntraces = 30;
npoints = 100;
points = (-1 :: 1 :: .01)`;
npoints = N Rows( points );
noise = 0.1;
traces = [];
For( ii = 1, ii <= ntraces, ii++,
trace = Cos( 2 * Pi() * 3 * points ) :*</img> Exp( -Pi() * points ^ 2 )
+J( npoints, 1, Random Normal( 0, noise ) );
traces = traces || trace;
);
strangetrace = Cos( 2 * Pi() * 2.5 * points ) :*</img> Exp( -Pi() * points ^ 2 )+J( npoints, 1, Random Normal( 0, noise ) );
traces = traces || strangetrace;
// put them into a data table and name columns descriptively
dt = As Table( points || traces );
dt << Set Name("Example Traces");
Column( dt, 1 ) << Set Name( "X" );
For( ii = 1, ii <= ntraces, ii++,
Column( dt, ii + 1 ) << Set Name( "Trace " || Char( ii ) )
);
Column( dt, ntraces + 2 ) << set name( "Strange Trace" );
// graph the traces
dt << Graph Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables(
X( :X ),
Y( :Trace 1 ),
Y( :Trace 2, Position( 1 ) ),
Y( :Trace 3, Position( 1 ) ),
Y( :Trace 4, Position( 1 ) ),
Y( :Trace 5, Position( 1 ) ),
Y( :Trace 6, Position( 1 ) ),
Y( :Trace 7, Position( 1 ) ),
Y( :Trace 8, Position( 1 ) ),
Y( :Trace 9, Position( 1 ) ),
Y( :Trace 10, Position( 1 ) ),
Y( :Trace 11, Position( 1 ) ),
Y( :Trace 12, Position( 1 ) ),
Y( :Trace 13, Position( 1 ) ),
Y( :Trace 14, Position( 1 ) ),
Y( :Trace 15, Position( 1 ) ),
Y( :Trace 16, Position( 1 ) ),
Y( :Trace 17, Position( 1 ) ),
Y( :Trace 18, Position( 1 ) ),
Y( :Trace 19, Position( 1 ) ),
Y( :Trace 20, Position( 1 ) ),
Y( :Trace 21, Position( 1 ) ),
Y( :Trace 22, Position( 1 ) ),
Y( :Trace 23, Position( 1 ) ),
Y( :Trace 24, Position( 1 ) ),
Y( :Trace 25, Position( 1 ) ),
Y( :Trace 26, Position( 1 ) ),
Y( :Trace 27, Position( 1 ) ),
Y( :Trace 28, Position( 1 ) ),
Y( :Trace 29, Position( 1 ) ),
Y( :Trace 30, Position( 1 ) ),
Y( :Strange Trace, Position( 1 ) )
),
Elements(
Line(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Y( 8 ),
Y( 9 ),
Y( 10 ),
Y( 11 ),
Y( 12 ),
Y( 13 ),
Y( 14 ),
Y( 15 ),
Y( 16 ),
Y( 17 ),
Y( 18 ),
Y( 19 ),
Y( 20 ),
Y( 21 ),
Y( 22 ),
Y( 23 ),
Y( 24 ),
Y( 25 ),
Y( 26 ),
Y( 27 ),
Y( 28 ),
Y( 29 ),
Y( 30 ),
Y( 31 ),
Legend( 5 )
)
)
);
// use FDE to find Fourier Basis Functions and Coefficients for Each Trace and save to a data table
Local( {obj},
obj = dt <<
Functional Data Explorer(
Data Format( Column ),
Y(
:Trace 1, :Trace 2, :Trace 3, :Trace 4, :Trace 5, :Trace 6, :Trace 7,
:Trace 8, :Trace 9, :Trace 10, :Trace 11, :Trace 12, :Trace 13,
:Trace 14, :Trace 15, :Trace 16, :Trace 17, :Trace 18, :Trace 19,
:Trace 20, :Trace 21, :Trace 22, :Trace 23, :Trace 24, :Trace 25,
:Trace 26, :Trace 27, :Trace 28, :Trace 29, :Trace 30, :Strange Trace
),
X( :X ),
Fourier Basis(
Functional PCA(
1,
FPC Profiler(
1,
Confidence Intervals( 1 ),
Term Value(
X( 0, N Levels( 201 ), Lock( 1 ), Show( 1 ) ),
FPC 1( 0, Lock( 0 ), Show( 1 ) )
)
)
)
),
SendToReport(
Dispatch(
{"Functional Data Explorer"},
"Data Processing",
OutlineBox,
{Close( 1 )}
),
Dispatch(
{"Functional Data Explorer", "Fourier Basis on Initial data"},
"Random Coefficients by Function",
OutlineBox,
{Close( 0 )}
),
Dispatch(
{"Functional Data Explorer", "Fourier Basis on Initial data"},
"Functional PCA",
OutlineBox,
{Close( 1 )}
)
)
);
Report( obj )["Fourier Basis on Initial data", "Random Coefficients by Function",
Table Box( 1 )] << Make Into Data Table;
obj << Close Window;
);
outdt= Get Data Table List()[1];
outdt << Set Name("Fourier Basis Coefficients for Traces");
// use explore outlier screening platform to find traces with outlying basis function coefficients
// note, this last step is specific to this problem, other problems might use more or less fourier basis
// functions, but the same general approach using Explore Outlier (Analyze > Screening > Explore Outliers)
// shoudl work fine
outdt << Explore Outliers(
Y(
:"Sine Period[3]"n, :"Cosine Period[3]"n, :"Sine Period[1.5]"n,
:"Cosine Period[1.5]"n, :"Sine Period[1]"n, :"Cosine Period[1]"n,
:"Sine Period[0.75]"n, :"Cosine Period[0.75]"n, :"Sine Period[0.6]"n,
:"Cosine Period[0.6]"n, :"Sine Period[0.5]"n, :"Cosine Period[0.5]"n,
:"Sine Period[0.43]"n, :"Cosine Period[0.43]"n, :"Sine Period[0.38]"n,
:"Cosine Period[0.38]"n, :"Sine Period[0.33]"n, :"Cosine Period[0.33]"n,
:"Sine Period[0.3]"n, :"Cosine Period[0.3]"n, :"Sine Period[0.27]"n,
:"Cosine Period[0.27]"n
),
Robust Fit Outliers( Huber( 1 ) ),
SendToReport(
Dispatch( {"Robust Fit Outliers"}, "", TabListBox, {Set Selected( 2 )} )
)
);
Exemple de graphe de traces générées (avec du bruit ajouté, une des traces est différente de toutes les autres)

Sortie FDE (résumé)

Explorer les valeurs aberrantes détecte la "trace étrange" (ligne 31) en fonction de ses coefficients de base de Fourier
