Guardar estimaciones de parámetros de regresión lineal por variableEstoy intentando hacer una regresión lineal de 2 columnas agrupadas por una tercera columna y estoy atascado. Quiero una columna con pendiente para esa fila y otra con intersección para esa fila.
Breve historia:
Tengo 30.000 formulaciones diferentes, cada una de las cuales ha sido probada con 13 niveles diferentes de ácido. Quiero entender la pendiente del pH en función de la concentración de ácido. Para mi rango (y propósito), puedo hacer esto como una regresión lineal.
Mi tabla de datos está configurada así, pero con 30.000 combinaciones de fórmulas y 13 niveles de ácido para un total de 390.000 filas.
| Fórmula |
Nivel de ácido |
pH |
|---|
ComboA
|
5 |
6.7 |
| ComboB |
5 |
6.75 |
| ComboC |
5 |
6.5 |
| ComboA |
10 |
6.4 |
| ComboB |
10 |
6.45 |
Sé que puedo trazarlos en Fit Y by X, agrupar los datos y luego agregar ajustes lineales, pero eso 1) lleva una eternidad con 30k grupos y 2) es complicado sacar las pendientes de ese informe.
Actualmente he dividido mi tabla por "Nivel de ácido", dividiendo "pH" y manteniendo "Fórmula". Sé que tengo algo como esto y quiero una forma de completar las 2 columnas correctas.
| Fórmula |
ph 5 |
ph 10 |
teléfono 15 |
ph 20 |
Pendiente |
Interceptar |
|---|
| ComboA |
datos |
datos |
datos |
datos |
|
|
| ComboB |
datos |
datos |
datos |
datos |
|
|
| ComboC |
datos |
datos |
datos |
datos |
|
|
La primera preferencia tiene que ver con una fórmula. Si necesito hacer un guión, también puedo hacerlo.
Gracias
Re: Regresión lineal de un conjunto de datos por una columna<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Encontré la siguiente forma de calcular la expresión.
SS_TOT = Suma( i = 1, N Fila( dt1 ), (Columna( dt1, k ) - un sentido) ^ 2 / N fila (dt1));
pero el cálculo se realiza para toda la columna "k".
¿Alguna pista sobre cómo podría incluir alguna separación de grupo?
SS_TOT[grupo#1] / SS_TOT[grupo#2] ...
Re: Regresión lineal de un conjunto de datos por una columnaVolviendo a este tema.
Entiendo toda la manipulación y puedo aplicarla a mis datos, pero aún no tengo muy clara la siguiente parte:
beta = J(ng, 2, .);
para (g=1, g <= ng, g++,
esteGrupo = Loc(ID de grupo == g);
beta[g, 0] = Transponer(Inv(xVals[esteGrupo, 0]`*xVals[esteGrupo, 0])*xVals[esteGrupo, 0]`*yVals[esteGrupo]);
);
No puedo entender qué está sucediendo excepto que se crea una matriz beta y todos los datos se reemplazan en una nueva tabla...
¿Podrías ayudarme a entender este punto?
Re: Regresión lineal de un conjunto de datos por una columnaLo comprobaré teniendo en cuenta tu último comentario. gracias ian
Re: Regresión lineal de un conjunto de datos por una columnaUna vez que tenga los coeficientes ajustados para cada grupo (como arriba), puede obtener los valores predichos y, por lo tanto, los residuos y la suma residual de cuadrados (para cada grupo). La suma total de cuadrados (para cada grupo) también es fácil, así que tienes todo lo necesario para obtener R-cuadrado (para cada grupo).
Sin embargo, tenga en cuenta que a medida que agregue más manipulaciones al JSL, llevará más tiempo (aunque en este caso será más rápido que usar la plataforma). ¡Alguien también necesita escribir y validar el código, por supuesto!
Re: Regresión lineal de un conjunto de datos por una columnaian
Gracias, es un buen enfoque con Matrix.
¿Hay alguna manera de obtener Rsquare también?
Re: Regresión lineal de un conjunto de datos por una columnaCasualmente, estaba a punto de señalar que, si sabes que necesitas regresión lineal y solo quieres los parámetros, entonces JSL es mucho más rápido. El siguiente código tardó unos 100 segundos en mi computadora portátil.
NombresDefaultToHere ( 1 ) ;
//Hacer algunos datos agrupados
gs = 10 ; // Tamaño del grupo
ng = 30000 ; // Número de grupos
Identificación del grupo = Orden ascendente ( Repetir (( 1 :: ng ) `, gs )) ;
xVals = j ( Nfila ( Identificación del grupo ) , 1 , AleatorioNormal ()) ;
yVals = j ( Nfila ( Identificación del grupo ) , 1 , AleatorioNormal ()) ;
//Pon los datos en una tabla
dt1 = Nueva tabla ( "Datos de regresión agrupados" ,
Nueva columna ( "Grupo" , Numérico , Nominal , Valores ( Identificación del grupo )) ,
Nueva columna ( "X" , Numérico , Continuo , Valores ( xVals )) ,
Nueva columna ( "y" , Numérico , Continuo , Valores ( yVals )) ,
) ;
// Descomentar este bloque para usar Fit Y By X para hacer el ajuste
/*
// Usar Ajustar Y por X
fxy = dt1 << Bivariado(Y( :y ), X( x ), Ajustar línea( {Color de línea( {208, 64, 86} )} ), Por(:Grupo));
// Obtener los parámetros ajustados en una tabla
// (Para hacer esto de forma interactiva, haga clic con el botón derecho en cualquier tabla de Estimaciones de parámetros del informe y seleccione 'Crear tabla de datos combinados')
fxyRep = fxy << Informe;
dt2 = fxyRep[1][TableBox(3)] << makeCombinedDataTable;
// dividir dt2
dt3 = dt2 << Dividir(Dividir por( :Término ), Dividir( :Estimación ), Grupo( :Grupo ), Columnas restantes( Eliminar todo ));
dt3 << setName("Estimaciones de parámetros a partir del ajuste Y por X");
Cerrar(dt2, noGuardar);
*/
/// Realizar la regresión lineal en JSL, sin pasar por la plataforma. . .
// (1) Obtener los datos de la tabla
xVals = Columna ( dt1 , "X" ) << obtenerAsMatrix ;
yVals = Columna ( dt1 , "y" ) << obtenerAsMatrix ;
Identificación del grupo = Columna ( dt1 , "Grupo" ) << obtenerAsMatrix ;
// (2) Agrega el vector unitario a la matriz de diseño
xVals = j ( Nfila ( xVals ) , 1 , 1 ) || xVals ;
// (3) Realiza la regresión lineal para cada grupo y almacena los resultados.
beta = j ( ng , 2 , . ) ;
para ( gramo = 1 , gramo <= ng , gramo ++,
este grupo = ubicación ( Identificación del grupo == gramo ) ;
beta [ gramo , 0 ] = Transponer ( inv ( xVals [ este grupo , 0 ] `* xVals [ este grupo , 0 ]) * xVals [ este grupo , 0 ] `* yVals [ este grupo ]) ;
) ;
// (4) Haz la tabla de resultados
dt4 = Como tabla ( beta ) ;
dt4 << escoger un nombre ( "Estimaciones de parámetros de JSL" ) ;
Columna ( dt4 , "Col1" ) << escoger un nombre ( "Interceptar" ) ;
Columna ( dt4 , "Col2" ) << escoger un nombre ( "X" ) ;
Re: Regresión lineal de un conjunto de datos por una columnaEl guión de Peter te será de gran utilidad.Sin embargo, como referencia, si tuviera que hacer esto con JMP en lugar de JSL (a menudo es una cuestión de tiempo dependiendo de si se trata de un análisis único o no), entonces, si ajusta su y por x, puede " Transmita" su línea de ajuste, vaya a tomar una taza de café si es necesario, luego, cuando JMP termine de ejecutarse, haga clic derecho en una de las tablas de estimación de parámetros y seleccione "crear tabla de datos combinados" para obtener una tabla con las estimaciones.Que es cómo ejecutar el guión de Peter sin el guión.
Re: Regresión lineal de un conjunto de datos por una columnaObtuve la mayor parte del código relevante de la publicación de Ian Cox. aquí .Esto hará el análisis y luego colocará todas las pendientes e intersecciones en una tabla.
dt = Nueva mesa ( "Data de muestra" , Agregar filas ( 6 ) ,
Nueva columna ( "Fórmula" , Personaje , Nominal ,
Establecer valores ( { "ComboA" , "ComboC" , "ComboB" , "ComboC" , "ComboA" , "ComboB" } )
) ,
Nueva columna ( "Nivel de acidez" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Establecer valores ( [ 5 , 15 , 5 , 5 , 10 , 10 ] )
) ,
Nueva columna ( "pH" , Numérico , Continuo , Formato ( "Mejor" , 12 ) ,
Establecer valores ( [ 6.7 , 4.8 , 6.75 , 6.5 , 6.4 , 6.45 ] )
)
) ;
// Ejecutar Fit Y por X
bv = dt << bivariado (
Y ( : pH ) ,
X ( : Nivel de ácido ) ,
Línea de ajuste ( { Color de linea ( { 213 , 72 , 87 } )} ) ,
Por ( : Fórmula )
) ;
// Una referencia a la capa del informe: bivREp también es una lista
bivRep = bv << Informe ;
// 'Crear tabla de datos combinados' evita tener que enviar mensajes a cada elemento en 'bivRep'
dt2 = bivRep [ 1 ] [ Cuadro de mesa ( 3 )] << Crear tabla de datos combinados ;
Re: Regresión lineal de un conjunto de datos por una columnaLa ejecución de JSL es muy útil para grandes conjuntos de datos y una gran cantidad de identificadores de grupo. ¿Existe alguna forma de iterar sobre identificadores de grupo no numéricos?
Y, por supuesto, también necesita una columna para almacenar el GroupID no numérico.