嗨!
我正在处理我数据集中14口井的各种岩石物理测井数据。记录数据具有在不同间隔中识别的缺失值,并且我想以各种方式估算这些值以查看哪种技术最佳。我一直在使用“探索缺失值”面板来实现从一个存在数据的变量到同一个孔中缺少数据的另一个变量的插补(例如 井中的伽马射线数据以50英尺的间隔丢失,但存在密度数据)。但是,如果我想在一个井中使用一个记录变量来在相同的记录变量中插入缺失值但在附近的另一个井中呢?例如,如果我在4000-6000英尺深度的一口井中有伽马射线数据而另一口井在5000-5800英尺深处缺少伽马射线,我怎样才能使用相同的变量(同一列)来估算缺失值不同的XY坐标?谢谢!
梅兰妮
下面是通过将井口围绕具有缺失值的井口并对其值进行平均,并将具有缺失值的井口设置为平均值来计算井口的值的示例。
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;
)
);