0

R は比較的新しいので、無知であることをあらかじめお詫びします。

私は、長年にわたって、全国の複数のサイトで観測のいくつかの (非常に大きな) データセットを扱っています。x週に観察を提出したサイトの総数のうち、x週に特定の種に注目したサイトの割合を計算する必要があります(本質的に存在/不在データ)。各個人の詳細を示す1つのデータセットがあります種の観察、および毎週の観察の総数の別のもの。そのため、その週に種が記録されたサイトの数をカウントし、それを同じ週に種の観察を記録したサイトの総数で割る関数が必要です。観測は、週 (1 ~ 53) と年 (1995 ~ 2011) で記録されます。

species.data の例 (貼り付けを簡単にするために csv としてリストされています):

SITE_ID, SPECIES, WEEKNO, YEAR
1289, Attenb., 1, 1995
1538, Attenb., 1, 1995
1894, Attenb., 2, 1995
1286, Attenb., 4, 1995
1238, Attenb., 7, 1995
1892, Attenb., 7, 1995

そして、total.obs.data の例:

YEAR, WEEKNO, TOTALOBS,
1995, 1, 100
1995, 2, 780
1995, 3, 100
1995, 4, 189
1995, 5, 382
1995, 6, 100
1995, 7, 899
1995, 8, 129

(したがって、ここでは、1995 年の第 1 週の比率が 2/100 であり、GLM または GAM のいずれかを構築できるとは考えていません)

4

2 に答える 2

0

上記のコメントですでに述べた質問のすべての制限に注意しながら、試してみましょう

#Create the data frame with the total observations
tot.obs<-data.frame(year=rep(1995,10), weekno=1:10, obs=floor(runif(n=10,80,100)))
#Create the variable week-year
tot.obs$week.year<-paste(tot.obs$week,tot.obs$year,sep="-")

#Create the data frame species observations
species.data<-data.frame(site=factor(floor(runif(n=5,2000,3000))), week=c(1,1,2,4,7), year=rep(1995,5),observ=rep(1,5))
species.data$week.year<-paste(species.data$week,species.data$year,sep="-")
species.data$total.obs<-NA

#Match the total observations form the tot.obs data frame to the species data frame. You can probably do it much faster but here is a "quick and dirty way"

for (i in 1:dim(species.data)[1]){
  species.data$total.obs[i]<-tot.obs$obs[tot.obs$week.year==species.data$week.year[i]]  
}

#Calculates the percentage of the total observation that each center contributes
species.data$per.obs<-species.data$observ/ species.data$total.obs 

#For the presentation of the data, reshape is your friend
library(reshape)
species.data.melt<-melt(species.data,id.vars=c("site","week.year"), measure.vars="per.obs")

cast(species.data.melt,site~week.year, fun.aggregate=sum)


site     1-1995     2-1995     4-1995     7-1995
1 2436 0.00000000 0.00000000 0.01010101 0.00000000
2 2501 0.00000000 0.01123596 0.00000000 0.00000000
3 2590 0.00000000 0.00000000 0.00000000 0.01123596
4 2608 0.01030928 0.00000000 0.00000000 0.00000000
5 2942 0.01030928 0.00000000 0.00000000 0.00000000

それ以外の場合、センターごとの観測に興味がない場合は、はるかに簡単です。

species.data.melt2<-melt(species.data,id.vars=c("week.year"), measure.vars="observ")
species.obs.total<-data.frame(cast(species.data.melt2,week.year~value, fun.aggregate=sum))
colnames(species.obs.total)[2]<-"aggregated.total"
species.obs.total$total<-NA

for (i in 1:dim(species.obs.total)[1]){
  species.obs.total$total[i]<-tot.obs$obs[tot.obs$week.year==species.obs.total$week.year[i]]  
}

species.obs.total$perc<-species.obs.total$aggregated.total/ species.obs.total$total
species.obs.total


  week.year aggregated.total total       perc
1    1-1995                2    97 0.02061856
2    2-1995                1    89 0.01123596
3    4-1995                1    99 0.01010101
4    7-1995                1    89 0.01123596
于 2012-07-01T20:29:57.770 に答える
0

現時点では、データが単純すぎて、複雑なテストをサポートできません。このxtabs関数は、その週の合計で割ることができるマトリックス オブジェクトを作成します。

> xtblspec <-  xtabs( ~ SPECIES+ SITE_ID +WEEKNO + YEAR  , data=dat)     
> xtblspec
, , WEEKNO = 1, YEAR = 1995

         SITE_ID
SPECIES   1238 1286 1289 1538 1892 1894
  Attenb.    0    0    1    1    0    0

, , WEEKNO = 2, YEAR = 1995

         SITE_ID
SPECIES   1238 1286 1289 1538 1892 1894
  Attenb.    0    0    0    0    0    1

, , WEEKNO = 4, YEAR = 1995

         SITE_ID
SPECIES   1238 1286 1289 1538 1892 1894
  Attenb.    0    1    0    0    0    0

, , WEEKNO = 7, YEAR = 1995

         SITE_ID
SPECIES   1238 1286 1289 1538 1892 1894
  Attenb.    1    0    0    0    1    0
#-------------

weekobs <- totobs[ match( as.numeric(dimnames(xtblspec[ 1, ,  ,])$WEEKNO ) ,totobs$WEEKNO) ,
                  "TOTALOBS"]
#[1] 100 780 189 899

行列の分割が適切に機能するように、特定の観測値の行列を正しく設定するには、最初の次元として WEEKNO を指定する必要があります。

xtblspec <-  xtabs( ~ WEEKNO +SPECIES+ SITE_ID  + YEAR  , data=dat)
> xtblspec/weekobs
, , SITE_ID = 1238, YEAR = 1995

      SPECIES
WEEKNO     Attenb.
     1 0.000000000
     2 0.000000000
     4 0.000000000
     7 0.001112347

, , SITE_ID = 1286, YEAR = 1995

      SPECIES
WEEKNO     Attenb.
     1 0.000000000
     2 0.000000000
     4 0.005291005
     7 0.000000000

, , SITE_ID = 1289, YEAR = 1995

      SPECIES
WEEKNO     Attenb.
     1 0.010000000
     2 0.000000000
     4 0.000000000
     7 0.000000000

, , SITE_ID = 1538, YEAR = 1995

      SPECIES
WEEKNO     Attenb.
     1 0.010000000
     2 0.000000000
     4 0.000000000
     7 0.000000000

, , SITE_ID = 1892, YEAR = 1995

      SPECIES
WEEKNO     Attenb.
     1 0.000000000
     2 0.000000000
     4 0.000000000
     7 0.001112347

, , SITE_ID = 1894, YEAR = 1995

      SPECIES
WEEKNO     Attenb.
     1 0.000000000
     2 0.001282051
     4 0.000000000
     7 0.000000000
于 2012-07-01T22:11:58.523 に答える