0

交差点の体積を計算するために adehabitat を使用するように勧められた後、私はちょっとした (できれば単純な) 問題に遭遇しました。このライブラリでは、交差のボリュームを計算する必要があるため、kerneloverlap コマンドを使用しています。プログラミングに関するいくつかの質問を手伝ってもらえないかと思っていました。「一括」処理しやすいようにスクリプトを変更する必要があります。特定のことが可能であることはわかっていますが、それを機能させる方法がわかりません。

コマンドは非常に単純です。

kerneloverlap(loc[,c("X","Y")], loc$year, lev = 90, grid=30, meth="VI", conditional=TRUE)

ここで、データ ファイル loc から x、y 座標を年ごとに取得し、使用率分布 90 でグリッド セル サイズ 30 との交差ボリュームを計算します。

入力ファイル (以下の抜粋を参照) は、anid、X、Y、年、および季節です。この例では、シーズンは 1 つしかありません (シーズンが 3 つあることに注意してください)。この例では、交差点の個々のボリュームごとに、1 シーズン内の年を比較したいと考えています。したがって、テスト データには、2 年と 1 シーズンと 2 人の個人が含まれます。私が言えることは、「2003 年から 2004 年の分娩期における動物 1 の交差の量は 0.8 であり、これは場所への重複と忠実度が高いことを示しています」ということです。

また、季節ごとに比較したいと思います。動物 1 の 2003 年の夏期と冬期の交差の量は 0.04 であり、これは重なりのレベルが低く、場所への忠実度がないことを示しています。」

心に留めておくべきこと: すべての個体が毎年存在するわけではなく、季節ごとに生きているわけでもありません。したがって、ある種のドロップレベルが必要になる場合があります。

これはこれまでの私の R スクリプトです (動作しません)。出力もうまく結合されていないことに注意してください。コンパイルされたファイルを取得できないようです。どの年、どの個体、どのシーズンと比較しているか教えていただければ幸いです。

IDNames= levels(loc$anid)
Year = unique(loc$year)
for (i in 1:(length(IDNames))){
vi90 = kerneloverlap(loc[,c("X","Y")], loc$year, lev = 90, grid=30, meth="VI", conditional=TRUE) 
    }
colnames(vi)= c(paste(IDNames[i],Year[n], sep =""),paste(IDNames[i], Year[n], sep =""))
}
write.csv(vi,"VolInter_indiv.csv")


    structure(list(anid = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L
), .Label = c("c_002", "c_104"), class = "factor"), X = c(276646.0514, 
276485.0397, 278102.4193, 278045.4716, 278993.8807, 274834.5677, 
278516.0218, 296741.8328, 299080.2451, 291874.5068, 168540.0024, 
168360.8211, 169538.2299, 164538.2592, 157321.7524, 148090.3478, 
140575.2442, 133369.7162, 134375.0805, 138763.5342, 232347.5137, 
231989.4609, 231793.1066, 234923.4012, 233374.4531, 232256.4667, 
233660.3445, 239317.3128, 246354.664, 145161.8922, 144148.7895, 
145154.7652, 145399.3515, 144581.4836, 143646.7295, 145055.3165, 
144613.1393, 145037.3035, 144701.2676), Y = c(2217588.648, 2216616.387, 
2219879.777, 2220818.804, 2216908.127, 2220423.322, 2216589.91, 
2234167.287, 2239351.696, 2232338.072, 2273737.333, 2273954.782, 
2269418.423, 2271308.607, 2264694.484, 2263710.512, 2254030.274, 
2253352.426, 2248644.946, 2262359.026, 2231404.821, 2229583.89, 
2231700.485, 2231598.882, 2237122.967, 2233302.185, 2240092.997, 
2237702.817, 2249213.958, 2261841.308, 2263064.156, 2262236.452, 
2264147.03, 2263214.877, 2263336.363, 2261417.946, 2256289.995, 
2256694.953, 2253352.576), year = c(2003L, 2003L, 2003L, 2003L, 
2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2004L, 2004L, 
2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 
2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L), season = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), .Label = "calving", class = "factor")), .Names = c("anid", 
"X", "Y", "year", "season"), class = "data.frame", row.names = c(NA, 
-39L))
4

1 に答える 1

6

はい、噛みます。

あなたのコードには、実行不可能にするいくつかのタイプミス(私は願っています)がありました。それを捨ててやり直しましょう。この関数kerneloverlapは、2番目のパラメーターで指定されたアイテムの各ペアのオーバーラップ値のマトリックスを返します。最初の例では、年を比較しています。

まず、1匹の動物のデータをどのように処理するかを想像し、その単純なケースに必要な値を出力する関数を記述します。

kernMod <- function(x){
    #x is the data for a single animal
    rs <- kerneloverlap(x[,c("X","Y")],
                        x$year,lev = 90, 
                        grid = 30, 
                        meth = "VI", 
                        conditional = TRUE)
    #Assumes we're only comparing two years
    out <- data.frame(year = paste(colnames(rs),collapse="-"), val = rs[2,1])
    out
}

これで、これを各動物に個別に適用できます。

kernMod(subset(loc,anid == 'c_002'))
       year val
1 2003-2004   0
> kernMod(subset(loc,anid == 'c_104'))
       year        val
1 2003-2004 0.06033966

またはddplyplyrパッケージから使用して、各動物に順番に適用することもできます。

ddply(loc,.(anid),.fun = kernMod)

  anid      year        val
1 c_002 2003-2004 0.00000000
2 c_104 2003-2004 0.06033966

複数の季節を含めるには、それを変数のリストに追加して、分割しますddply(未テスト)。

ddply(loc,.(anid,season),.fun = kernMod)

1年以内の季節を比較するには、2番目の引数としてkernMod渡すx$seasonように変更してから、(テストされていない)のようなものを呼び出す必要があります。

ddply(loc,.(anid,year),.fun = kernMod)

完全なデータに複数年が含まれている場合は、nxn行列が返されるkernModため、さらに変更が必要になりkerneloverlapます。ここで、nはデータの年数です。おそらくこのようなもの(テストされていない)

kernMod <- function(x){
    #x is the data for a single animal
    rs <- kerneloverlap(x[,c("X","Y")],
                        x$year,lev = 90, 
                        grid = 30, 
                        meth = "VI", 
                        conditional = TRUE)
    rs[lower.tri(rs,diag = TRUE)] <- NA
    rs <- melt(rs)
    rs <- subset(rs, !is.na(value))
    out <- data.frame(year = paste(rs$X1,rs$X2,collapse="-"), val = rs$value)
    out
}

このアプローチでは、データがある値を計算するだけで「行方不明」の動物を処理する必要があります。

Ok。このために3番目から4番目の著者を取得したいのですが、謝辞を述べたいと思います。;)

于 2011-09-22T00:40:57.297 に答える