離散データポイントで表される一連のサーフェスの下のボリュームを決定する必要があります。私のデータでは、各サンプルは、データフレームのリスト内の別個のデータフレームとして格納されます。同様の質問へ離散データで定義された表面下の体積を計算する方法は?
df1 <- data.frame(x=c(2,2,2,3,3,3,4,4,4,5,5,5,6,6,6),
y=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
z=c(0,2,0,4,6,7,3,2,1,2,7,8,9,4,2))
df2 <- data.frame(x=c(2,2,2,3,3,3,4,4,4,5,5,5,6,6,6),
y=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
z=c(1,1,2,3,5,6,2,1,3,3,8,9,8,3,1))
DF <- list(df1,df2)
回答がいずれかの他の言語(MATLAB、パイソン)、または解答に問題(as here)に対処するために使用可能なスクリプトが含まれていないされています。ここではいくつかの(小)データ例です。 1)データフレーム(DF)のリスト全体に適用されるRの関数として、シンプソンのルールの離散化されたバージョンを書き出します。 2)x、y、zの間の任意の関係を計算し、多変量数値積分を使って表面下の体積を求める(パッケージpracmaではsimpson2d/quad2d、キューブではadaptIntegrateのような関数を用いる)。
複合シンプソンのルール(私が使用したい)の式はhereですが、その複雑さのために、私は働いている二重合計関数を書くことに失敗しています。この式において、I(λ(em)λ(ex))は各x、y格子点の上記データセットのzに等しく、Delta(em)およびDelta(ex)はxとyの間の間隔を表す。
第2のアプローチは、基本的にアプローチfound hereを多変量スプラインフィットに拡張し、予測されたz値を積分の関数として渡します。ここで私はこれまでこのアプローチで試したことがあります:
require(pracma)
df1.loess <- loess(z ~ x + y, data=DF[[1]])
mod.fun <- function(x,y) predict(df1.loess, newdata=x,y)
simpson2d(mod.fun, x=c(2,6), y=c(1,3))
しかし、これは有用な結果をもたらしません。
実際には、私は個々のサンプルに対してほぼ100データフレームのリストを持っているので、リスト内のすべてのデータフレームにわたってこれらの計算を自動化する一連のラッピ関数としてソリューションを表現することが本当に必要です。例は次のようになります。
require(akima)
DF.splines <- lapply(DF, function(x,y,z) interp(x = "x", y = "y", z = "z",
linear=F, nx=4, ny=2))
残念ながら、これは欠損値とInfsの例外を生成します。私は、これらの戦略の1つをどのようにして成功させるか、あるいは別の(より単純な)アプローチを活用するための提案については非常に公開しています。 Kriging関数(DiceKrigingパッケージのkmのような)は、数値積分のために渡すことができるより良い適合を生み出すことができますか?
あなたの形は凸ですか? – cryo111
はい、各データフレームは、x座標とy座標の間に等間隔の矩形領域を記述します。私はz値のランダムに変動する表面の下の領域を探しています。これらの領域は凸でなければなりません。 – Jason
ああ、私はx、yグリッドが普通ではないことが分かりました。 Convexは、あなたのボリューム内から取り出す任意の2点に対して、その2点を結ぶ直線上のすべての点がそのボリューム内にあることを意味します。したがって、zの値が任意の場合、ボリュームは凸ではない可能性が最も高いです。 – cryo111