1

動物の位置データに対してモンテカルロ シミュレーションを実行しようとしています。これまでに、100 回の X 座標と Y 座標を 100 回サンプリングしました。これにより、200 個のリストが得られます。次に、このリストを、各サンプル (kernel.area) に対して実行したい最終的な関数をより助長するデータフレームに変換します。

現在、200 列のデータ フレームがあり、連続する列の各ペアを使用して kernel.area 関数を実行したいと考えています。

ここでは自分のデータをうまく再現できないので、使用しているデータ フレームの構造を示すためだけに、基本的な例を示してみました。これまでに試した for ループを含めましたが、私はまだ R の初心者であり、提案をいただければ幸いです。

# generate dataframe representing X and Y positions
df <- data.frame(x=seq(1:200),y=seq(1:200)) 

# 100 replications of sampling 100 "positions"
resamp <- replicate(100,df[sample(nrow(df),100),])

# convert to data frame (kernel.area needs an xy dataframe)
df2 <- do.call("rbind", resamp[1:2,])
# xy positions need to be in columns for kernel.area
df3 <- t(df2)

#edit: kernel.area requires you have an id field, but I am only dealing with one individual, so I'll construct a fake one of the same length as the positions
id=replicate(100,c("id"))
id=data.frame(id)

これが私が試したforループの構造です(最初の投稿以降に編集されました):

for (j in seq(1,ncol(df3)-1,2)) { 
  kud <- kernel.area(df3[,j:(j+1)],id=id,kern="bivnorm",unin=c("m"),unout=c("km2"))
  print(kud)
}

私の最終目標はkernel.area、各リサンプリング イベント (つまり、200 までの列のペアごとに行 1:100) を計算し、結果をデータフレームに結合できるようにすることです。ただし、ループを実行した後、次のエラー メッセージが表示されます。

Error in df[, 1] : incorrect number of dimensions

編集:ID形式がデータフレームと同じではないことに気付いたので、変更するとエラーが発生しました:

Error in kernelUD(xy, id, h, grid, same4all, hlim, kern, extent) : 
id should have the same length as xy
4

1 に答える 1

2

まず、免責事項: 私は、あなたが使用していると思わadehabitatれる function を持つpackagekernel.areaを使用したことがありません。おそらく、問題の関数がどのパッケージに含まれているかを確認できます。


ただし、特定のパッケージの知識に関係なく、私ができるいくつかの提案があると思います。

  1. 1 つ目は、 の作成にありdf3ます。これはおそらく のはず df3 <- t(df2)ですが、これは実際のコードでは正しい可能性が高く、投稿のタイプミスにすぎません。

  2. 2 番目の提案はdf3、ループ内でサブセット化する方法に関係しています。は、( R で数学演算が実行される順序については を参照)よりも優先順位が高いj:j+1ため、単一の数値です。目的の 2 つの列を取得するには、代わりに を使用します。:+?Syntaxj:(j+1)


編集:

をロードするときadehabitat、「注意してください」と関連する新しいパッケージを使用するように警告されました。その中にはadehabitatHR、機能も含まれているkernel.area. この関数の構文と動作はわずかに異なりますが、検討する価値はあるでしょう。adehabitatHR(パッケージはR 2.15.0では利用できないため、ソースからインストールする必要がありました)を使用して、次のことができました。

library(adehabitatHR)

for (j in seq(1,ncol(df3)-1,2)) { 
  kud <-kernelUD(SpatialPoints(df3[,j:(j+1)]),kern="bivnorm")
  kernAr<-kernel.area(kud,unin=c("m"),unout=c("km2"))
  print(kernAr)
}

detach(package:adehabitatHR, unload=TRUE)

これは何かを出力し、以下のコメントに記載されているように、kernelUD()before と呼ばれkernel.area()ます。

于 2012-04-24T21:11:16.967 に答える