Una forma rápida de crear una tabla de valores RsquaredTengo un script que encuentra el valor Rsquared para un parámetro frente a muchos parámetros.Una vez en una tabla, es fácil ordenar los mejores valores.Ha funcionado muy bien a lo largo de los años, pero cuando trato de presionarlo para encontrar el valor de decenas de miles o más parámetros, toma mucho tiempo.Me preguntaba si alguien conoce una forma rápida en JSL para hacer esto.
Cosas que he intentado pero todas toman demasiado tiempo:
1. Realización de un informe bivariado y lectura del Rsq del árbol de visualización.
xip = bivariado (Y( columna (resp.)), X( evaluar (hecho)), polinomio de ajuste (grado), invisible);
Este comando en realidad funciona más rápido de lo que esperaría, pero recorrer el árbol de visualización para obtener los valores lleva la mayor parte del tiempo.
2. Usando Fit Model -> StepWise -> Todos los modelos posibles de 1 término.
Esto parece ajustarse solo a filas de datos que no tienen datos faltantes para todos los términos y es posible que tenga muchos datos faltantes para algunos términos.Entonces no se ajusta a mis necesidades.
3. Sumar cuadrados con una función como la siguiente.
GetRsquared = function ({x,y}, {sx,sy,ssxx,ssyy,ssxy,nr,np,i},
sx=0;
sy=0;
ssxx=0;
ssyy=0;
ssxy=0;
nr=nrows(y);
np=nr;
for( i=1, i<=nr, i++,
if(is missing(x[i]),np--,
if(is missing(y[i]),np--,
sx=sx+x[i];
sy=sy+y[i];
ssxx=ssxx+x[i]*x[i];
ssyy=ssyy+y[i]*y[i];
ssxy=ssxy+x[i]*y[i]
)));
ssxx=ssxx-sx*sx/np;
ssyy=ssyy-sy*sy/np;
ssxy=ssxy-sx*sy/np;
r2=ssxy*ssxy/ssxx/ssyy
);
Re: Una forma rápida de crear una tabla de valores RsquaredGracias por toda tu ayuda.Me gustaría resumir aquí, solo para que haya un registro para futuros exploradores de JMP.
Estaba tratando de encontrar una manera de determinar rápidamente todos los valores de R Squared de un término frente a muchos términos, hasta ~100 000 términos.
En mi prueba, ajusté 2000 términos, usando un HP EliteBook con Windows 7, sistema operativo de 64 bits, CPU Intel Core i5-4300U a 190 GHz 2,50 Ghz, 16 GB de RAM.
Mi método original de 1) hacer un bucle de ajuste bivariado y leer el R cuadrado del árbol de visualización, o 2) cálculos de fuerza bruta, ambos tomaron ~ 37 segundos en mi computadora portátil.¡Eso es ~ 30 minutos por 100,000 términos!¡Y quiero hacer esto por más de un término de respuesta!
El método de usar la plataforma Multivariante consumió todos los recursos de mi computadora durante ~ 15 minutos y luego se bloqueó debido a la falta de memoria.No intentes esto en casa.
¡El método sobre el uso de la detección de respuesta de KarenC tomó 1 segundo!Esta es claramente la solución.Marqué una respuesta de mikedriscoll como la Solución solo porque resume la discusión y muestra el código a usar.
Para completar, aquí está el código que usé al final.
dt es mi tabla de datos original.
resp es una cadena de caracteres que nombra la columna y de interés.
fact es una lista de cadenas de caracteres que nombran las x columnas de interés.
dt1 = dt << Response Screening(Y(column(resp)), X(eval(fact)));
// Note: This is not a normal table and JMP will not recognize dt1 as a table
// The 'table' is called "Pvalues". Hopefully you don't already have a table of that name.
// Of course you can write more code to make this error proof.
// To immediately move this information to a normal JMP table I took a subset.
dt2 = Data Table( "PValues" ) << Subset( All rows, Selected columns only( 0 ) );
// Now I can do other things, like ...
dt2 << Sort( By( :RSquare ), Order( Descending ), Replace Table );
rsq = dt2:RSquare<< get as matrix;
Re: Una forma rápida de crear una tabla de valores RsquaredPuede llamar a la plataforma de evaluación de respuestas desde JSL... desde allí, mis conocimientos de JSL no pueden ayudarlo.
Re: Una forma rápida de crear una tabla de valores RsquaredEn respuesta a su primera pregunta sobre mi secuencia de comandos, multivariante solo tiene las variables "Y", por lo que concateno X e Y y dejo que lo calcule. No recuerdo lo que hago para la superposición, pero supongo que lo manejo de alguna manera.
La evaluación de respuesta que señaló Karen tiene mucho más sentido para lo que estaba tratando de hacer.Aparentemente, puede ser guionado. Ejecútelo como una prueba, luego mire el triángulo rojo de la salida del informe, no la tabla. El triángulo rojo superior. Haga clic en guardar secuencia de comandos -> en la ventana de secuencia de comandos y podrá verlo. No sé cómo obtener la referencia a la tabla y los valores r, pero probablemente obtendría una lista de tablas abiertas antes de que se ejecutara el script... luego encontraría la nueva después de generarla.
Cribado de respuesta( Y(.... ), X(.... ) )
Re: Una forma rápida de crear una tabla de valores RsquaredTambién me sorprende que no haya una entrada de "Fuente" en la nueva tabla de datos.Le sugiero que agregue una entrada en la Lista de deseos de JMP solicitando que se agregue esto.
Re: Una forma rápida de crear una tabla de valores Rsquaredkaren,
Esto es muy rápido y parece obtener todos los parámetros que podría desear.
Mi aplicación es parte de un script que hace otras cosas con los resultados.
¿Crees que se puede guionizar?
Me sorprende que no haya una variable Fuente para la tabla.
Re: Una forma rápida de crear una tabla de valores RsquaredMiguel,
Gracias por la respuesta.Intenté esto.¿Es esto solo registrar la R de términos comunes sobre todos los datos?Me pregunto si es resistente a las malas columnas de datos.
Palmadita
Re: Una forma rápida de crear una tabla de valores RsquaredRecientemente he estado usando Analyze>Screening>Resposne Screening (no JSL solo la interfaz de usuario) para obtener valores de RSq.Esto funciona para uno frente a muchos parámetros o muchos frente a muchos parámetros. Es rápido. Termina con otra información, sin embargo, los valores RSq están en la tabla de valores p que se genera. Sugerencia adicional: en la tabla de valor P, puede seleccionar filas (pares de parámetros) y ejecutar el script de tabla "Ajustar elementos seleccionados" para obtener ajustes bivariados. Me encanta esto porque siempre quiero ver una relación que parezca fuerte numéricamente antes de que realmente lo crea.
Re: Una forma rápida de crear una tabla de valores RsquaredTengo un script que hace más o menos lo mismo. Solía usar el bivariado, ahora uso el multivariado (vea el subconjunto del script a continuación).Recientemente encontré un error que aún no he solucionado, probablemente con caracteres especiales en el nombre de la columna. Pero en general esto debería funcionar. No recuerdo si lo he usado en conjuntos de datos tan grandes, pero para los datos con los que trabajé, esto fue mucho más rápido.Tenga en cuenta que para obtener un número genérico de x frente a un número genérico de y, en realidad está calculando (num_x + num_y) frente a (num_x + num_y), que aún es más rápido que recorrer el bivariado.
Editar: el método de Karen parece mucho más eficiente/elegante que este. Si alguna vez necesito actualizar mi script, definitivamente revisaría ese método.
numX = nitems(xParamNames);
numy = nitems(yParamNames);
yxParamNames = concat(yParamNames, xParamNames);
mvObj = Multivariate(
// Y(evallist(yParamList)
Y(evallist(yxParamNames)
),
Estimation Method( "Row-wise" ),
Matrix Format( "Square" ),
Scatterplot Matrix(0
)
);
corrMatrixObj = mvObj << xpath( "//OutlineBox[ text() = 'Correlations']//MatrixBox");
corrMatrix = corrMatrixObj << get();
corrMatrix = corrMatrix[1];
corrMatRows = 1::numY;
corrMatCols = (numY+1)::(numY+numX);
sub_corrMatrix = corrMatrix[corrMatRows,corrMatCols];
myRsqr = aslist(power(sub_corrMatrix,2)); // rsqr is corr matrix to the power 2. rest of script expects a list.
mvObj<< closewindow();