¡Hola!
Estoy trabajando con varios datos de registro de pozos petrofísicos de 14 pozos en mi conjunto de datos. Los datos de registro tienen valores faltantes que se han identificado en diferentes intervalos y me gustaría imputar estos valores de varias maneras para ver qué técnicas son las mejores. He estado usando el panel Explorar valores perdidos para implementar la imputación de una variable donde los datos están presentes a otra variable donde los datos faltan en el mismo pozo (por ejemplo, Los datos de rayos gamma faltan en el pozo a un intervalo de 50 pies pero los datos de densidad están presentes). Pero, ¿qué sucede si me gustaría usar una variable de registro en un pozo para imputar los valores perdidos en la misma variable de registro pero en otro pozo cercano? Por ejemplo, si tengo datos de Rayos Gamma en un pozo a profundidades de 4000-6000 pies y otro pozo cercano falta Rayos Gamma a profundidades de 5000-5800 pies, ¿cómo puedo usar la misma variable (la misma columna) para imputar valores perdidos en una ¿Bien con diferentes coordenadas XY? ¡Gracias!
Melanie
A continuación se muestra un ejemplo de cálculo de un valor para un cabezal de pozo tomando los cabezales de pozo que rodean al cabezal de pozo que tiene el valor faltante, promediando sus valores y configurando el cabezal de pozo con el valor faltante en el valor promediado.
Names Default To Here( 1 );
// Create a new table to use
dt = New Table( "Untitled 7",
Add Rows( 2500 ),
New Column( "x", Numeric, "Continuous", Format( "Best", 12 ), Set Display Width( 42 ) ),
New Column( "y", Numeric, "Continuous", Format( "Best", 12 ), Set Display Width( 83 ) ),
New Column( "data", Numeric, "Continuous", Format( "Best", 12 ), )
);
// Populate the data, leaving 2% missing data
theRow = 0;
For( i = 1, i <= 50, i++,
For( k = 1, k <= 50, k++,
theRow = theRow + 1;
:x[theRow] = i;
:y[theRow] = k;
If( Random Integer( 0, 100 ) <= 98,
:data[theRow] = Random Uniform( 800, 1000 ),
:data[theRow] = .;
write("\!nMissing value for row ", therow)
);
)
);
// Impute missing values by averaging the well heads around the missing value
For( theRow = 1, theRow <= N Rows( dt ), theRow++,
If( Is Missing( :data[theRow] ) == 1,
minX = :x[theRow] - 1;
If( minX < 1, minX = 1 );
maxX = :x[theRow] + 1;
If( maxX > 50, maxX = 50 );
minY = :y[theRow] - 1;
If( minY < 1, minY = 1 );
maxY = :y[theRow] + 1;
If( maxY > 50, maxY = 50 );
impute = 0;
count = 0;
For( i = minX, i <= maxX, i++,
For( k = minY, k <= maxY, k++,
theValue = dt:data[dt << get rows where( dt:x == i & dt:y == k )][1];
If( Is Missing( theValue ) == 0,
count
++);
impute = Sum( impute, theValue );
)
);
:Data[theRow] = impute / count;
)
);¡Gracias por la respuesta! Intentaré esto.