2014-09-01 1 views
-1

Этот вопрос является продолжением от earlier post, но с различным набором данных и более подробными сведениями.Работа над подписями

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

data <- structure(list(IndID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("P01", 
"P02", "P03", "P04", "P05", "P06", "P07"), class = "factor"), 
    PreyGen = structure(c(1L, 1L, 1L, 1L, 6L, 5L, 4L, 5L, 4L, 
    4L, 4L, 4L, 4L, 5L, 5L, 4L, 5L, 4L, 5L, 5L, 5L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 5L, 5L, 4L, 5L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 5L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    5L, 2L, 4L, 3L, 4L, 4L, 4L, 3L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 1L, 4L, 1L, 5L, 4L, 5L, 4L, 4L, 4L, 5L, 4L, 
    4L), .Label = c("Beaver", "Bobcat", "Coyote", "Deer", "Elk", 
    "Raccoon"), class = "factor")), .Names = c("IndID", "PreyGen" 
), class = "data.frame", row.names = c(NA, -100L)) 

summary из которых выглядит следующим образом.

> summary(data) 
IndID  PreyGen 
P01: 6 Beaver : 6 
P02:23 Bobcat : 2 
P03:12 Coyote : 4 
P04:20 Deer :71 
P05:21 Elk :16 
P06: 7 Raccoon: 1 
P07:11 

Имеются 7 разных индивидуумов (INDID) одного и того же вида и 6 видов добычи (PreyGen). Каждый человек ел различное количество жертв в разных пропорциях (это основное отличие от более раннего поста).

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

РЕДАКТИРОВАТЬ добавлен set.seed() и полный выход для P01

set.seed(1) 
BootIndDiet <- list() 
IndTotboot <- list() 
for(i in unique(data$IndID)){ 
    for(j in 1:5){ 
     BootIndDiet[[j]] <- prop.table(table(sample(data$PreyGen[data$IndID == i], 
         length(data$PreyGen[data$IndID == i]),replace = T))) 
         } 
      IndTotboot[[i]] <- BootIndDiet 
      } 

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

> IndTotboot[[1]] 
[[1]] 

    Beaver Bobcat Coyote  Deer  Elk Raccoon 
0.6666667 0.0000000 0.0000000 0.0000000 0.3333333 0.0000000 

[[2]] 

    Beaver Bobcat Coyote  Deer  Elk Raccoon 
0.8333333 0.0000000 0.0000000 0.0000000 0.1666667 0.0000000 

[[3]] 

    Beaver Bobcat Coyote  Deer  Elk Raccoon 
0.3333333 0.0000000 0.0000000 0.0000000 0.1666667 0.5000000 

[[4]] 

    Beaver Bobcat Coyote  Deer  Elk Raccoon 
0.6666667 0.0000000 0.0000000 0.0000000 0.1666667 0.1666667 

[[5]] 

    Beaver Bobcat Coyote  Deer  Elk Raccoon 
0.8333333 0.0000000 0.0000000 0.0000000 0.1666667 0.0000000 

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

В то время как моя петля дает правильные результаты, мне интересно, как рассчитать sd() загруженных диет для каждого вида добычи, когда данные содержатся во вложенных списках.

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

EDIT Согласно предложению по @MrFlick

Примера вывод будет выглядеть следующим образом

  P01 P02 P03 P04 P05 P06 P07 
    Beaver A 
    Bobcat B 
    Coyote C 
    Deer D 
     Elk E 
    Raccoon F 

Где «A» - это sd пропорций бобров, съеденных P01 во всех пяти образцах. Используя выход P01 сверху, «A» = sd (0,66666667, 0,8333333, 0,33333333, 0,66666667, 0,8333333). Двигаясь вниз, «B» будет представлять sd пропорций Bobcat, съеденных P01 во всех пяти образцах, и так далее для каждого вида добычи и индивидуума.

Заранее спасибо.

+0

(-1) Этот вопрос указывает ту же цель, что и связанный с ней вопрос. Если эти ответы не сработают для вас, вы можете предложить щедрость. –

+0

@ Richard Scriven, ответы работали, учитывая отсутствие специфики в моем предыдущем посте. Кроме того, данные, которые я включил в предыдущий пост, не отражают мои реальные данные. Хотя цель одна и та же, данные для работы отличаются. ИМО связанный вопрос может быть удален, но решил, что хозяева позади SO сделают вызов. –

+1

Вы также должны указать желаемый результат. Это также помогло бы использовать 'set.seed()' при использовании функций, которые являются стохастическими, например 'sample', которые являются воспроизводимыми. Когда вы говорите, что хотите «sd пропорциональных вхождений» означает, что вы просто хотите «sd» всех значений для каждого животного для каждого человека? поэтому для P01 вы получите sd для всех пропорций бобров, затем sd для всех пропорций bobcat и т. д.? Какова «форма» желаемого результата? – MrFlick

ответ

1

Итак, вот как я могу подойти к нему.Во-первых, я определить * применять чистые версии rbind, чтобы сделать вещи немного чище

rbindlist <- function(x) do.call(rbind, x) 

Тогда я применить это к каждому человеку, создавая матрицу пропорций, то я использую функцию базового apply вдоль столбцов в вычислить СКО каждого

sapply(lapply(IndTotboot, rbindlist), apply, 2, sd) 

Это возвращает

   P01  P02  P03  P04  P05  P06  P07 
Beaver 0.2041241 0.00000000 0.00000000 0.00000000 0.00000000 0.1749636 0.04979296 
Bobcat 0.0000000 0.00000000 0.00000000 0.00000000 0.05429407 0.0000000 0.00000000 
Coyote 0.0000000 0.00000000 0.00000000 0.02236068 0.03984095 0.0000000 0.00000000 
Deer 0.0000000 0.09425862 0.09128709 0.05477226 0.07968191 0.1749636 0.11853095 
Elk  0.0745356 0.09425862 0.09128709 0.04472136 0.03984095 0.0000000 0.08131156 
Raccoon 0.2173067 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.00000000 

по желанию.

+0

Спасибо @MrFlick! Очень полезно. Чем больше специфика ваша «удобная для использования» функция ...? Еще раз спасибо. –

+1

Это просто применяется в том смысле, что функции приложения передают данные в качестве первого параметра, а 'do.call' нуждается в данных в качестве второго параметра. Таким образом, вспомогательная функция просто вытолкнула данные обратно слотом параметров. – MrFlick

 Смежные вопросы

  • Нет связанных вопросов^_^