2014-08-31 1 views
-1

Я пытаюсь загрузчику пропорционального возникновения диеты элементов для 7 людей и вычислить sd()Работы по подспискам с применить() функции

Допустит, есть 9 пунктов добычи в меню.

Diet <- c("Beaver","Bird", "Bobcat","Coyote", "Deer", "Elk", 
    "Porcupine", "Raccoon", "SmMamm") 

И что эти пункты добычи поедают 7 различных особей одного вида

Inds <- c("P01", "P02", "P03", "P04", "P05", "P06", "P07") 

Моя цель бутстраповская пропорциональная возникновение каждого элемента диеты для каждого человека.
Цикл ниже генерирует пять диет для каждого человека (каждая диета, содержащая N = 20 кормлений), которые были взяты с заменой. Данные хранятся в виде списка лиц, каждый из которых содержит список образцов диет.

BootIndDiet <- list() 
IndTotboot <- list() 
for(i in Inds){ 
    for(j in 1:5){ 
     BootIndDiet[[j]] <- prop.table(table(sample(Diet, 20 ,replace = T))) 
         } 
      IndTotboot[[i]] <- BootIndDiet 
      } 

Ниже я включил первые две диеты индивидуального P07 в качестве примера цикла приводит к

$P07 
$P07[[1]] 

    Beaver  Bird Bobcat  Deer  Elk 
    0.05  0.15  0.20  0.10  0.15 
Porcupine Raccoon SmMamm 
    0.15  0.15  0.05 

$P07[[2]] 

    Beaver  Bird Bobcat Coyote  Deer 
    0.15  0.10  0.20  0.05  0.05 
     Elk Porcupine Raccoon SmMamm 
    0.05  0.20  0.10  0.10 

Затем я хочу, чтобы вычислить SD() пропорционального каждого вида для каждого человека , Равномерно для каждого человека (P01 - P07) я хочу sd() пропорционального появления каждого вида добычи в течение пяти диет.

В то время как мой цикл выше работает, я подозреваю, что это лучший способ (возможно, используя функцию загрузки()), что позволяет избежать списков ...

В то время как я только включал 5 образцов (бутстрэпы) для каждого человека здесь , Я надеюсь создать 10000.

Предложения по другой стратегии или как подать заявку sd() через под-списки.

+0

Если проблемы с памятью не возникает вы можете хранить ваши данные в длинном формате «data.frame» с колоннами -say- [Ind, No_diet, добыча, проп], а затем вы можете просто позвонить 'агрегатный (проп ~ Ind + prey, mydataframe, sd) '. –

ответ

2

Я бы попытаться получить массив (вместо вложенного списка) таким образом:

IndTotboot <-array(replicate(5*length(Inds),prop.table(table(sample(as.factor(Diet), 20 ,replace = T))),simplify=T), dim=c(length(Diet),5,length(Inds)), dimnames=list(Diet,NULL,Inds)) 

С replicate вы можете выполнить это выражение заданное количество раз и сохранить результат в виде массива (если возможно). Я добавил as.factor до Diet, чтобы убедиться, что таблица берет следы каждой диеты (даже те, у которых частота 0).

Полученный объект IndTotboot представляет собой трехмерную матрицу, в которой первый индекс указывает Diet, второй - на загрузку, а третий - на Inds. Оттуда вы можете использовать apply стандартным способом.

Edit:

Если вы пытаетесь str(IndTotboot) вы получите:

> str(IndTotboot) 
    num [1:9, 1:5, 1:7] 0.1 0.15 0.15 0.1 0.1 0.1 0.15 0.05 0.1 0.15 ... 
    - attr(*, "dimnames")=List of 3 
     ..$ : chr [1:9] "Beaver" "Bird" "Bobcat" "Coyote" ... 
     ..$ : NULL 
     ..$ : chr [1:7] "P01" "P02" "P03" "P04" ... 

Первая линия является наиболее важным. Он говорит num [1:9, 1:5, 1:7], что означает массив 9x5x7. Остальное указывает dimnames, имена размеров, которые являются списком. Они являются обобщением rownames и colnames для матрицы.

Теперь, чтобы получить sd для каждого Diet и Inds вы просто использовать apply:

apply(IndTotboot,MARGIN=c(1,3),sd) 
+0

Прохладные мысли @nicola, хотя я не могу получить код для apply(). Строка str() указателя IndTotboot указывает список, но результаты от lapply (IndTotboot, sd) явно неверны. Что мне не хватает ...? –

+0

'IndTotboot' - это массив, а не список. Я собираюсь расширить свой ответ, чтобы показать, как использовать заявку. – nicola

0

После может быть полезным:

dd = data.frame(sapply(IndTotboot, function(x)x)) 

maindf = data.frame(Var1=as.character(), Freq=as.numeric()) 

for(rr in 1:nrow(dd)) for (cc in 1:ncol(dd)){ 
     maindf= merge(maindf, data.frame(dd[rr,cc]), all=TRUE) 
} 

> head(maindf, 10) 
    Var1 Freq 
1 Beaver 0.05 
2 Beaver 0.10 
3 Beaver 0.15 
4 Beaver 0.20 
5 Beaver 0.30 
6 Bird 0.05 
7 Bird 0.10 
8 Bird 0.15 
9 Bird 0.20 
10 Bird 0.25 


with(maindf, tapply(Freq, Var1, sd)) 
    Beaver  Bird  Bobcat  Coyote  Elk Porcupine Raccoon  SmMamm  Deer 
0.09617692 0.09354143 0.09354143 0.09354143 0.09354143 0.06454972 0.07905694 0.108.07905694 

Для каждого физического лица:

counter=1 
for (cc in 1:ncol(dd)){ 
    maindf = data.frame(Var1=as.character(), Freq=as.numeric()) 
    for(rr in 1:nrow(dd)){ 
     maindf= merge(maindf, data.frame(dd[rr,cc]), all=TRUE) 
    } 
    cat("\nFor individual number: ",counter,"\n"); counter=counter+1 
    print(with(maindf, tapply(Freq, Var1, sd))) 
} 


For individual number: 1 
    Beaver  Bird  Bobcat  Coyote  Elk Porcupine Raccoon  SmMamm  Deer 
0.05000000 0.07637626 0.05000000 0.06454972 0.03535534 0.05000000 0.05000000 0.07637626 0.05000000 

For individual number: 2 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.05000000 0.108.03535534 0.05000000 0.09128709   NA 0.03535534 0.07637626 0.13149778 

For individual number: 3 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.03535534 0.07637626 0.12583057 0.03535534 0.03535534 0.06454972 0.05000000 0.10606602 0.06454972 

For individual number: 4 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.05000000 0.05000000 0.05000000 0.03535534 0.10408330 0.07905694 0.05000000 0.03535534 0.10408330 

For individual number: 5 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.05000000 0.03535534 0.05000000 0.03535534 0.03535534 0.03535534 0.05000000 0.05000000 0.07071068 

For individual number: 6 
    Beaver  Coyote  Deer  Elk Porcupine Raccoon  SmMamm  Bobcat  Bird 
0.10000000 0.07637626 0.03535534 0.05000000 0.07071068 0.03535534 0.05000000 0.10408330 0.10606602 

For individual number: 7 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.03535534 0.05000000 0.10408330 0.07637626 0.05000000 0.13228757 0.07637626 0.03535534 0.05000000 

Для отдельных + видов:

maindf = data.frame(Var1=as.character(), Freq=as.numeric(), ind=as.numeric()) 
counter=1 
for (cc in 1:ncol(dd)){ 
    for(rr in 1:nrow(dd)){ 
     maindf= merge(maindf, cbind(data.frame(dd[rr,cc]),ind=counter), all=TRUE) 
    } 
    counter=counter+1 
} 
with(maindf, tapply(Freq, list(Var1,ind), sd)) 

        1   2   3   4   5   6   7 
Beaver 0.05000000 0.05000000 0.03535534 0.05000000 0.05000000 0.10000000 0.03535534 
Bird  0.07637626 0.108.07637626 0.05000000 0.03535534 0.10606602 0.05000000 
Bobcat 0.05000000 0.03535534 0.12583057 0.05000000 0.05000000 0.10408330 0.10408330 
Coyote 0.06454972 0.05000000 0.03535534 0.03535534 0.03535534 0.07637626 0.07637626 
Elk  0.03535534   NA 0.06454972 0.07905694 0.03535534 0.05000000 0.13228757 
Porcupine 0.05000000 0.03535534 0.05000000 0.05000000 0.05000000 0.07071068 0.07637626 
Raccoon 0.05000000 0.07637626 0.10606602 0.03535534 0.05000000 0.03535534 0.03535534 
SmMamm 0.07637626 0.13149778 0.06454972 0.10408330 0.07071068 0.05000000 0.05000000 
Deer  0.05000000 0.09128709 0.03535534 0.10408330 0.03535534 0.03535534 0.05000000 
+0

См. Мое редактирование выше. – rnso