Ciao!
Sto lavorando con vari dati petrofisici del pozzo di log da 14 pozzetti nel mio set di dati. I dati di registrazione hanno valori mancanti che sono stati identificati in intervalli diversi e vorrei imputare questi valori in vari modi per vedere quali tecniche sono le migliori. Ho utilizzato il pannello Esplora valori mancanti per implementare l'imputazione da una variabile in cui i dati sono presenti in un'altra variabile in cui i dati mancano nello stesso pozzetto (ad es. I dati Gamma Ray sono mancanti nel pozzetto a intervalli di 50 piedi ma sono presenti dati di densità). Ma cosa succede se mi piacerebbe utilizzare una variabile di registrazione in un pozzo per imputare valori mancanti nella stessa variabile di registrazione ma in un altro pozzo vicino? Ad esempio, se ho dati Gamma Ray in un pozzo a profondità 4000-6000 ft e un altro pozzo vicino manca Gamma Ray a profondità 5000-5800 ft, come posso usare la stessa variabile (stessa colonna) per imputare valori mancanti in un bene con diverse coordinate XY? Grazie!
Melanie
Di seguito è riportato un esempio di calcolo di un valore per una testa di pozzo prendendo le teste del pozzo attorno alla testa del pozzo che ha il valore mancante e calcolando la media dei loro valori e impostando il pozzo con il valore mancante sul valore medio.
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;
)
);Grazie per la risposta! Ci proverò.