Cómo escribir una curva de calibraciónHola, mi nivel de scripting es realmente básico y espero que me puedan ayudar.
¿Cómo escribo un guión para lograr lo siguiente?
Tengo una tabla con las concentraciones conocidas de los calibradores. En cada ensayo (una tabla por ensayo) tengo la señal de varias incógnitas así como la señal de los calibradores, es básicamente una curva de calibración interna para cada ensayo.
¿Es posible crear una secuencia de comandos que tome los valores de la tabla de concentraciones conocidas, los represente frente a sus señales para ese ensayo específico (tabla de ensayo) y luego use la regresión lineal para calcular la concentración de las incógnitas?
¡Gracias de antemano por la ayuda!
Re: Cómo programar una curva de calibración¡Esto es perfecto! No puedo agradecerte lo suficiente Marcos.
Re: Cómo programar una curva de calibración
Names Default to Here( 1 );
// check for sufficient tables
n tables = N Table();
If( n tables < 2,
Throw( "Two data tables are required for this analysis" )
);
tables = List();
For( t = 1, t <= n tables, t++,
Insert Into( tables, Eval( Data Table( t ) << Get Name ) );
);
// identify the calibration and unknown data tables
dlg = New Window( "Assay Unknown Samples", << Modal,
H List Box(
lb = List Box( tables ),
Line Up Box( N Col( 2 ),
Button Box( "Calibrator Table",
sel = lb << Get Selected;
cal lb << Append( sel );
),
cal lb = List Box( {},
N Lines( 1 )
),
Button Box( "Unknown Table",
sel = lb << Get Selected;
unk lb << Append( sel );
),
unk lb = List Box( {},
N Lines( 1 )
)
)
),
H List Box(
Button Box( "OK",
cal table = cal lb << Get Items;
Show( cal table );
unk table = unk lb << Get Items;
Show( unk table );
),
Button Box( "Cancel" )
)
);
If( dlg["Button"] == -1,
Throw( "User cancelled" )
);
// unload the dialog
cal table = Data Table( cal table[1] );
unk table = Data Table( unk table[1] );
// include AU 2 values for calibrators from calibration table
combined = cal table << Join( With( unk table ),
Copy formula( 0 ),
Select With( :Sample, :Peps, :AU 1 ),
Select( :AU 2 ),
By Matching Columns( :Peps = :Peps ),
Drop Multiples( 0, 0 ),
Include Nonmatches( 0, 1 ),
Preserve Main Table Order( 0 )
);
Close( cal table, No Save );
Close( unk table, No Save );
// distinquish peps
Current Data Table( combined );
combined << New Column( "Status", "Character", "Nominal" );
For Each Row(
:Status = If( 1 <= Num( Regex( :Peps, "\w{3}(\d+)", "\1" ) ) <= 29, "Calibrator", "Unknown" );
);
// placeholders for matching information
combined
<< New Column( "Predicted AU 2", "Numeric", "Continuous" )
<< New Column( "Lower 95%", "Numeric", "Continuous" )
<< New Column( "Upper 95%", "Numeric", "Continuous" );
// handle each sample set separatelySummarize( sample = By( combined:Sample ) );
Summarize( sample list = By( combined:Sample ) );
For( s = 1, s <= N Items( sample list ), s++,
// isolate sample
combined
<< Select Where( :Sample == sample list[s] )
<< Invert Row Selection
<< Exclude;
// fit the calibration curve for this sample
dlg = combined << Fit Model(
Y( :AU 1 ),
Effects( :AU 2 ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
Where( :Status == "Calibrator" )
);
fit = dlg << Run;
// access report layer
fit rep = fit << Report;
title = fit rep[OutlineBox(1)] << Get Title;
fit rep[OutlineBox(1)] << Set Title( title || ", Sample = " || sample list[s] );
// determine the assay for the unknown samples from the calibration curve
For Each Row(
If( Not( Excluded( Row State( Row() ) ) ),
fit << Inverse Prediction( Response( :AU 1[] ) );
);
);
// remove extraneous string column box that interferes with making combined data table
(fit rep << XPath( "//StringColBox[StringColBoxHeader=\!"Type of CI\!"]")) << Delete;
// extract the assays into a new data table
assays = fit rep["Inverse Prediction"][TableBox(1)] << Make Combined Data Table;
// fit << Close Window;
// prepare predicted values for join
assays
<< Delete Columns( Column( assays, 1 ) )
<< New Column( "Sample", "Character", "NominaL" )
<< New Column( "Peps", "Character", "NominaL" );
Current Data Table( combined );
r = 1;
For Each Row(
If( Not( Excluded( Row State( Row() ) ) ),
assays:Sample[r] = combined:Sample;
assays:Peps[r] = combined:Peps;
r++;
);
);
combined << Clear Row States;
combined << Update(
With( assays ),
Match Columns(
:Sample = :Sample,
:Peps = :Peps
)
);
Close( assays, No Save );
);
Re: Cómo programar una curva de calibraciónEsta es la última petición, ¡lo prometo!
¿Cómo debo reescribir esta parte para que la secuencia de comandos sea un poco más genérica y pueda aplicarse a cualquier conjunto de muestras, independientemente de sus nombres? Por ejemplo, en lugar de escribir:
muestra = Lista ("001-AAA", "002-AAA", "003-AAA", "004-AAA");
¿Podemos codificar para hacer un resumen de la columna Muestra y buscar esas entradas para hacer la Lista?
También sería genial si fuera posible trazar las curvas de calibración con la función Bivariante y hacer que aparezcan al final para que podamos tener una visión del ajuste que se realizó.
Re: Cómo programar una curva de calibración¡Perfecto!
¡Gracias por todo Marcos!
Re: Cómo programar una curva de calibraciónEl índice ahora solo se usa para el recuento de iteraciones. Las etiquetas de muestra específicas se capturarían en una lista antes de la iteración.
// handle each sample set separately
sample = List( "001-AAA", "002-AAA", "003-AAA" );
For( s = 1, s <= 3, s++,
// isolate sample
combined
<< Select Where( :Sample == sample[s] )
<< Invert Row Selection
<< Exclude;
Re: Cómo programar una curva de calibraciónCreo que me has entendido mal. Por dudas, quise decir que no entendía la función del código. ¡Sé muy, muy poco sobre codificación y no me atrevería a dudar de su código!Sólo estoy tratando de entender y aprender de ti.
Creo que entiendo el primer ejemplo.
En el segundo ejemplo, si en lugar de números las muestras también tienen una designación de texto, ¿cómo se cambiaría el código? Por ejemplo, en lugar de la muestra 1, 2 y 3, tenemos la muestra 001-AAA, 002-AAA y 003-AAA.
Re: Cómo programar una curva de calibración¿Dudas de mi código? Bueno, es su prerrogativa.
El primer ejemplo llena una nueva columna sin usar una propiedad de fórmula de columna.
For Each Row(
:Status = If( 1 <= Num( Regex( :Peps, "\w{3}(\d+)", "\1" ) ) <= 29, "Calibrator", "Unknown" );
);
El Por cada fila() La función itera sobre las filas de la tabla de datos actual. Maneja las filas de indexación automáticamente. Entonces la asignación ocurre por filas. El lado derecho de la asignación es el Si() función. El primer argumento se interpreta como una expresión booleana. Si esta expresión se evalúa como verdadera, el segundo argumento ("Calibrador") se evalúa y se devuelve. De lo contrario, se evalúa y devuelve el tercer argumento ("Desconocido"). El primer argumento determina si el número de Peps está en el rango de 1 a 29. La cadena de números se extrae con una expresión regular y se convierte en un número. La expresión regular coincide con un patrón de tres caracteres de palabra seguidos de uno o más dígitos. La referencia posterior devuelve el único grupo de captura.
El segundo ejemplo itera sobre las tres muestras en el conjunto de datos.
For( s = 1, s <= 3, s++,
// isolate sample
ss = Char( s );
combined
<< Select Where( :Sample == ss )
<< Invert Row Selection
<< Exclude;
Utiliza un índice entero que se convierte en una cadena de caracteres para que coincida con el atributo de la columna de datos. Envía una cascada de mensajes a la tabla de datos combinados para (1) seleccionar todas las filas de la muestra actual, (2) cambiar la selección a todas las filas que no pertenecen a la muestra actual y (3) excluir esas filas. Este enfoque suele ser más simple y rápido que crear subconjuntos de tablas de datos y luego unir y concatenar las tablas de datos con los resultados.
Re: Cómo programar una curva de calibración¡Funciona perfectamente! Gracias.
Creo que entiendo lo que hace cada línea de código. Tengo algunas dudas sobre estos:
<SPAN class="token function">For Each Row</SPAN><SPAN class="token punctuation">(</SPAN>
<SPAN class="token punctuation">:</SPAN>Status <SPAN class="token operator">=</SPAN> <SPAN class="token function">If</SPAN><SPAN class="token punctuation">(</SPAN> <SPAN class="token number">1</SPAN> <SPAN class="token operator"><=</SPAN> <SPAN class="token function">Num</SPAN><SPAN class="token punctuation">(</SPAN> <SPAN class="token function">Regex</SPAN><SPAN class="token punctuation">(</SPAN> <SPAN class="token punctuation">:</SPAN>Peps<SPAN class="token punctuation">,</SPAN> <SPAN class="token string">"\w{3}(\d+)"</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token string">"\1"</SPAN> <SPAN class="token punctuation">)</SPAN> <SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><=</SPAN> <SPAN class="token number">29</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token string">"Calibrator"</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token string">"Unknown"</SPAN> <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN><SPAN class="token function">For</SPAN><SPAN class="token punctuation">(</SPAN> s <SPAN class="token operator">=</SPAN> <SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN> s <SPAN class="token operator"><=</SPAN> <SPAN class="token number">3</SPAN><SPAN class="token punctuation">,</SPAN> s<SPAN class="token operator">++</SPAN><SPAN class="token punctuation">,</SPAN>
<SPAN class="token comment">// isolate sample</SPAN>
ss <SPAN class="token operator">=</SPAN> <SPAN class="token function">Char</SPAN><SPAN class="token punctuation">(</SPAN> s <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
combined
<SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Select Where</SPAN><SPAN class="token punctuation">(</SPAN> <SPAN class="token punctuation">:</SPAN>Sample <SPAN class="token operator">==</SPAN> ss <SPAN class="token punctuation">)</SPAN>
<SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Invert Row Selection
</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Exclude</SPAN><SPAN class="token punctuation">;</SPAN>
¿Podrías explicármelos, por favor?
Re: Cómo programar una curva de calibraciónNames Default to Here( 1 );
// check for sufficient tables
n tables = N Table();
If( n tables < 2,
Throw( "Two data tables are required for this analysis" )
);
tables = List();
For( t = 1, t <= n tables, t++,
Insert Into( tables, Eval( Data Table( t ) << Get Name ) );
);
// identify the calibration and unknown data tables
dlg = New Window( "Assay Unknown Samples", << Modal,
H List Box(
lb = List Box( tables ),
Line Up Box( N Col( 2 ),
Button Box( "Calibrator Table",
sel = lb << Get Selected;
cal lb << Append( sel );
),
cal lb = List Box( {},
N Lines( 1 )
),
Button Box( "Unknown Table",
sel = lb << Get Selected;
unk lb << Append( sel );
),
unk lb = List Box( {},
N Lines( 1 )
)
)
),
H List Box(
Button Box( "OK",
cal table = cal lb << Get Items;
Show( cal table );
unk table = unk lb << Get Items;
Show( unk table );
),
Button Box( "Cancel" )
)
);
If( dlg["Button"] == -1,
Throw( "User cancelled" )
);
// unload the dialog
cal table = Data Table( cal table[1] );
unk table = Data Table( unk table[1] );
// include AU 2 values for calibrators from calibration table
combined = cal table << Join( With( unk table ),
Copy formula( 0 ),
Select With( :Sample, :Peps, :AU 1 ),
Select( :AU 2 ),
By Matching Columns( :Peps = :Peps ),
Drop Multiples( 0, 0 ),
Include Nonmatches( 0, 1 ),
Preserve Main Table Order( 0 )
);
Close( cal table, No Save );
Close( unk table, No Save );
// distinquish peps
Current Data Table( combined );
combined << New Column( "Status", "Character", "Nominal" );
For Each Row(
:Status = If( 1 <= Num( Regex( :Peps, "\w{3}(\d+)", "\1" ) ) <= 29, "Calibrator", "Unknown" );
);
// placeholders for matching information
combined
<< New Column( "Predicted AU 2", "Numeric", "Continuous" )
<< New Column( "Lower 95%", "Numeric", "Continuous" )
<< New Column( "Upper 95%", "Numeric", "Continuous" );
// handle each sample set separately
For( s = 1, s <= 3, s++,
// isolate sample
ss = Char( s );
combined
<< Select Where( :Sample == ss )
<< Invert Row Selection
<< Exclude;
// fit the calibration curve for this sample
dlg = combined << Fit Model(
Y( :AU 1 ),
Effects( :AU 2 ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
Where( :Status == "Calibrator" )
);
fit = dlg << Run;
// determine the assay for the unknown samples from the calibration curve
For Each Row(
If( Not( Excluded( Row State( Row() ) ) ),
fit << Inverse Prediction( Response( :AU 1[] ) );
);
);
// access report layer
fit rep = fit << Report;
// remove extraneous string column box that interferes with making combined data table
(fit rep << XPath( "//StringColBox[StringColBoxHeader=\!"Type of CI\!"]")) << Delete;
// extract the assays into a new data table
assays = fit rep["Inverse Prediction"][TableBox(1)] << Make Combined Data Table;
fit << Close Window;
// prepare predicted values for join
assays
<< Delete Columns( Column( assays, 1 ) )
<< New Column( "Sample", "Character", "NominaL" )
<< New Column( "Peps", "Character", "NominaL" );
Current Data Table( combined );
r = 1;
For Each Row(
If( Not( Excluded( Row State( Row() ) ) ),
assays:Sample[r] = combined:Sample;
assays:Peps[r] = combined:Peps;
r++;
);
);
combined << Clear Row States;
combined << Update(
With( assays ),
Match Columns(
:Sample = :Sample,
:Peps = :Peps
)
);
Close( assays, No Save );
);Re: Cómo programar una curva de calibraciónSi, tienen los 29 peps como calibradores internos. Esos 29 peps específicos deben obtener los valores AU 2 de la tabla de calibración y luego cada conjunto calibra los peps restantes asociados al número de muestra.
Creo que hice esto más confuso al pedir dos cosas diferentes en la misma publicación. Lo siento por eso.
Re: Cómo programar una curva de calibraciónEntonces, ¿los tres conjuntos de muestras deben manejarse por separado?
Re: Cómo programar una curva de calibraciónCreo que hablé demasiado pronto. Hay un problema Mark. En este momento, el script está extrayendo todos los valores AU 2 de la tabla calib a la tabla unk para los calibradores y eso está bien. Pero luego, la nueva tabla usa todos los que se asignaron con la designación de calibrador para usar en el modelo de ajuste y las incógnitas se predicen a partir de ese modelo (que tiene los calibradores de las muestras 1, 2 y 3 combinados), ¿verdad?
Lo que necesito es un modelo de ajuste por muestra y que las incógnitas de esa muestra se determinen únicamente con el modelo de ajuste asociado con esa muestra.
Re: Cómo programar una curva de calibración¡Esto es perfecto! ¡Muchas gracias Marcos!
Re: Cómo programar una curva de calibraciónVale, gracias por aclarar.
Names Default to Here( 1 );
// check for sufficient tables
n tables = N Table();
If( n tables < 2,
Throw( "Two data tables are required for this analysis" )
);
tables = List();
For( t = 1, t <= n tables, t++,
Insert Into( tables, Eval( Data Table( t ) << Get Name ) );
);
// identify the calibration and unknown data tables
dlg = New Window( "Assay Unknown Samples", << Modal,
H List Box(
lb = List Box( tables ),
Line Up Box( N Col( 2 ),
Button Box( "Calibrator Table",
sel = lb << Get Selected;
cal lb << Append( sel );
),
cal lb = List Box( {},
N Lines( 1 )
),
Button Box( "Unknown Table",
sel = lb << Get Selected;
unk lb << Append( sel );
),
unk lb = List Box( {},
N Lines( 1 )
)
)
),
H List Box(
Button Box( "OK",
cal table = cal lb << Get Items;
Show( cal table );
unk table = unk lb << Get Items;
Show( unk table );
),
Button Box( "Cancel" )
)
);
If( dlg["Button"] == -1,
Throw( "User cancelled" )
);
// unload the dialog
cal table = Data Table( cal table[1] );
unk table = Data Table( unk table[1] );
// include AU 2 values for calibrators from calibration table
combined = cal table << Join(
With( unk table ),
Copy formula( 0 ),
Select With( :Sample, :Peps, :AU 1 ),
Select( :AU 2 ),
By Matching Columns( :Peps = :Peps ),
Drop Multiples( 0, 0 ),
Include Nonmatches( 0, 1 ),
Preserve Main Table Order( 0 )
);
Close( cal table, No Save );
Close( unk table, No Save );
// distinquish peps
Current Data Table( combined );
combined << New Column( "Status", "Character", "Nominal" );
For Each Row(
:Status = If( 1 <= Num( Regex( :Peps, "\w{3}(\d+)", "\1" ) ) <= 29, "Calibrator", "Unknown" );
);
// fit the calibration curve
dlg = combined << Fit Model(
Y( :AU 1 ),
Effects( :AU 2 ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
Where( :Status == "Calibrator" )
);
fit = dlg << Run;
// determine the assay for the unknown samples from the calibration curve
For Each Row(
fit << Inverse Prediction( Response( :AU 1[] ) );
);
// extract the assays into a new data table
assays = Report( fit )["Inverse Prediction"][TableBox(1)] << Make Combined Data Table;
fit << Close Window;
assays << Delete Columns( Column( assays, 1 ) );
// add the assays to the unknown table
final = combined << Join(
With( assays ),
Copy formula( 0 ),
By Matching Columns( :AU 1 = :Specified AU 1 ),
Drop Multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve Main Table Order( 1 )
);
Close( combined, No Save );
Close( assays, No Save );
final << Sort(
By( :Peps, :Sample ),
Order( Ascending, Ascending ),
Replace Table
);
Faltan algunos de los valores previstos de AU 2 debido a las mediciones aleatorias de AU 1.
Re: Cómo programar una curva de calibraciónFuncionó perfectamente. Y hace lo que pedí ayuda. Pero había dos partes de mi publicación inicial. El primero fue saber cómo programar la calibración tal como me mostraste.
El segundo, que no tiene relación con el primero, por lo que sería un script completamente diferente, es hacer lo siguiente:
La tabla desconocida tiene 3 muestras, cada muestra se analizó para 74 Peps. 29 de esos Peps los quiero usar para calibrar los otros 45. Y quiero hacerlo obteniendo los valores AU 2 de la tabla de calibración. Entonces, el script debe obtener los valores de AU 2 de la tabla de calibración y unirlos con los Peps 1-29 para cada muestra en la tabla desconocida, luego de lo cual debe hacer una curva de calibración (regresión lineal) para cada una de las muestras y atribuir AU 2 valores al resto 45 Peps.
¡Gracias por su paciencia conmigo!
Sé que los valores no se correlacionan, estos fueron valores generados aleatoriamente con el propósito de aprender a escribir.
Re: Cómo programar una curva de calibraciónEstoy confundido.
En primer lugar, ¿funcionó o no? ¿Funcionó hasta cierto punto?
En segundo lugar, sí, la calibración se realiza en su totalidad con los valores AU 1 y AU 2 de la tabla de calibración. ¿No es eso correcto?
En tercer lugar, no tiene valores de AU 2 en la tabla desconocida. ¿Quiere usar los valores de AU 2 desconocidos previstos?
Cuarto, ¿es esto un cambio en la definición de calibración o es un nuevo requisito (seguir el paso) después de predecir la AU? 2 en la tabla desconocida?
Quinto, ¿qué es Sample? ¿Cómo se relaciona con Peps?
Sexto, ¿no debería estar correlacionado el AU 1 en la tabla de calibradores para Pep1 con Pep29? Ellos no son:

Probablemente me estoy perdiendo algo muy importante y muy básico.
Re: Cómo programar una curva de calibraciónGracias Mark, funcionó ahora.
Por lo que entendí, mirando el script, esto es para la calibración directa usando los valores AU 1 y AU 2 de la tabla de calibradores, ¿sí?
¿Cómo podemos reorganizarlo para que el calibrador tenga los valores de AU 1 especificados en la tabla de calibradores frente a los AU 2 de la tabla desconocida (lo que lo convierte en un calibrador diferente para cada muestra) y luego predecir los valores de AU 2 para el resto de los componentes? en la muestra?
Re: Cómo programar una curva de calibraciónEs un problema de versión. Abrí JMP 13 y (1) la función ya no estaba resaltada como tal y (2) no se encuentra en el índice de secuencias de comandos.
¡Odio cuando eso ocurre!
Pruebe esta solución alternativa:
Names Default to Here( 1 );
// find all open data tables
/* for JMP 14 and later:
tables = Get Data Table List();
*/
n tables = N Table();
If( n tables < 2,
Throw( "Two data tables are required for this analysis" )
);
tables = List();
For( t = 1, t <= n tables, t++,
Insert Into( tables, Eval( Data Table( t ) << Get Name ) );
);
// present open tables for assignment as calibration or unknown.
dlg = New Window( "Assay Unknown Samples", << Modal,
H List Box(
lb = List Box( tables ),
Line Up Box( N Col( 2 ),
Button Box( "Calibrator Table",
sel = lb << Get Selected;
cal lb << Append( sel );
),
cal lb = List Box( {},
N Lines( 1 )
),
Button Box( "Unknown Table",
sel = lb << Get Selected;
unk lb << Append( sel );
),
unk lb = List Box( {},
N Lines( 1 )
)
)
),
H List Box(
Button Box( "OK",
cal table = cal lb << Get Items;
Show( cal table );
unk table = unk lb << Get Items;
Show( unk table );
),
Button Box( "Cancel" )
)
);
If( dlg["Button"] == -1,
Throw( "User cancelled" )
);
// unload dialog
cal table = Data Table( cal table[1] );
unk table = Data Table( unk table[1] );
// perform the linear calibration
dlg = cal table << Fit Model(
Y( :AU 1 ),
Effects( :AU 2 ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
fit = dlg << Run;
// perform inverse prediction on unknown
Current Data Table( unk table );
For Each Row(
fit << Inverse Prediction( Response( :AU 1[] ) );
);
// unload unknown assays
assays = Report( fit )["Inverse Prediction"][TableBox(1)] << Make Combined Data Table;
fit << Close Window;
assays << Delete Columns( Column( assays, 1 ) );
// join with unknown table
unk table << Join(
With( assays ),
By Row Number
);
Close( assays, No Save );
// plot predictions with 95% confidence intervals versus actual
unk table << Graph Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables(
X( :AU 1 ),
Y( :Lower 95% ),
Y( :Upper 95%, Position( 1 ) ),
Y( :Predicted AU 2, Position( 1 ) )
),
Elements(
Bar( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 8 ), Bar Style( "Interval" ) )
),
SendToReport(
Dispatch( {}, "AU 1", ScaleBox, {Format( "Best", 12 )} ),
Dispatch( {}, "Lower 95%", ScaleBox, {Format( "Fixed Dec", 12, 0 )} )
)
);Re: Cómo programar una curva de calibraciónTal vez sea un problema de la versión JMP (tengo JMP 13.1) pero el script no funciona. Utilicé el depurador JSL y me sale un error justo al principio: Nombre no resuelto: Obtener lista de tabla de datos en el acceso o evaluación de 'Obtener lista de tabla de datos', Obtener lista de tabla de datos() /*###*/
Re: Cómo programar una curva de calibraciónCreo que entiendo el problema básico, pero podría haberme perdido un detalle. Pruebe este script con ambas tablas de datos abiertas (tabla de calibración y tabla desconocida):
Names Default to Here( 1 );
// find all open data tables
tables = Get Data Table List();
If( N Items( tables ) < 2,
Throw( "Two data tables are required for this analysis" )
);
dlg = New Window( "Assay Unknown Samples", << Modal,
H List Box(
lb = List Box( tables ),
Line Up Box( N Col( 2 ),
Button Box( "Calibrator Table",
sel = lb << Get Selected;
cal lb << Append( sel );
),
cal lb = List Box( {},
N Lines( 1 )
),
Button Box( "Unknown Table",
sel = lb << Get Selected;
unk lb << Append( sel );
),
unk lb = List Box( {},
N Lines( 1 )
)
)
),
H List Box(
Button Box( "OK",
cal table = cal lb << Get Items;
Show( cal table );
unk table = unk lb << Get Items;
Show( unk table );
),
Button Box( "Cancel" )
)
);
If( dlg["Button"] == -1,
Throw( "User cancelled" )
);
// unload dialog
cal table = Data Table( cal table[1] );
unk table = Data Table( unk table[1] );
// perform the linear calibration
dlg = cal table << Fit Model(
Y( :AU 1 ),
Effects( :AU 2 ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
fit = dlg << Run;
// perform inverse prediction on unknown
Current Data Table( unk table );
For Each Row(
fit << Inverse Prediction( Response( :AU 1[] ) );
);
// unload unknown assays
assays = Report( fit )["Inverse Prediction"][TableBox(1)] << Make Combined Data Table;
fit << Close Window;
assays << Delete Columns( Column( assays, 1 ) );
// join with unknown table
unk table << Join(
With( assays ),
By Row Number
);
Close( assays, No Save );
// plot predictions with 95% confidence intervals versus actual
unk table << Graph Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables(
X( :AU 1 ),
Y( :Lower 95% ),
Y( :Upper 95%, Position( 1 ) ),
Y( :Predicted AU 2, Position( 1 ) )
),
Elements(
Bar( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 8 ), Bar Style( "Interval" ) )
),
SendToReport(
Dispatch( {}, "AU 1", ScaleBox, {Format( "Best", 12 )} ),
Dispatch( {}, "Lower 95%", ScaleBox, {Format( "Fixed Dec", 12, 0 )} )
)
);
El guión no es flexible pero es un comienzo.
Re: Cómo programar una curva de calibraciónAquí hay dos tablas de ejemplo. Una es la tabla de calibradores. La otra tabla es la que tiene los valores medidos (AU 1) y necesita calibración para obtener los valores desconocidos (AU 2). Para complicar un poco las cosas, esta tabla tiene las medidas de 3 muestras diferentes y cada una de estas 3 muestras también contenía los componentes que se usaron para fabricar el calibrador. Así que en cada muestra tenemos un calibrador interno, por así decirlo.
Sería genial saber cómo programar una calibración que omita por completo el hecho de que tenemos un calibrador interno (regresión lineal simple simple de lo que está en la tabla del calibrador y usar la expresión para obtener las incógnitas de la tabla de muestras). Y sería aún mejor saber cómo programar una calibración que use los valores medidos (AU 1) de los componentes del calibrador en cada muestra (tabla de muestras), los represente frente a los valores conocidos (AU 2) en la tabla del calibrador y calcule las incógnitas para esa muestra específica, y hace lo mismo para cada muestra presente en la tabla de muestras.
El inglés no es mi idioma nativo, así que avíseme si necesita que sea un poco más claro.
Espero que puedas ayudarme.
Salud.
Re: Cómo programar una curva de calibraciónGracias por verificar el método y el proceso de análisis. ¡Adelante con el guión!
¿Puede proporcionar una muestra de datos? Puede utilizar nombres genéricos (datos anónimos). De esa manera entenderé lo que el script debe esperar de la tabla de datos.
Re: Cómo programar una curva de calibracióngracias marca
He seguido los pasos que mencionas para obtener la predicción inversa personalizada. Sí, es una regresión lineal.
Mi problema con eso es el número limitado de incógnitas que puedo ingresar. La pregunta de secuencias de comandos se hizo teniendo en cuenta que tengo miles de incógnitas y supuse que la secuencia de comandos del procedimiento me permitiría obtener valores para todas esas incógnitas.
Re: Cómo programar una curva de calibraciónLe sugiero que primero aprenda a realizar este análisis de forma interactiva utilizando JMP. Ver Ayuda > Libros > Modelado Predictivo y Especializado > capitulo sobre Ajustar curva . Explicará cómo usar esta plataforma para su propósito. Incluye ejemplos para guiarlo y ayudarlo a practicar antes de intentar analizar sus propios datos.
¿Qué modelo utiliza actualmente para su curva de calibración? Usted menciona la regresión lineal. Si este es el caso, haga clic en el triángulo rojo junto a Ajustar curva y seleccione polinomios > Ajuste lineal . Ahora haga clic en el triángulo rojo junto a Lineal y seleccione Predicción inversa personalizada . Aparece un cuadro de diálogo en el que puede introducir las respuestas desconocidas.
Utilice primero la plataforma Fit Curve de forma interactiva para asegurarse de que este análisis sea apropiado y produzca los resultados que busca. Entonces podemos ayudar con un guión.