Получить частоты (абсолютные и относительные) уровней категориальной переменной из двоичных данных заболеваемости путем комбинации факторов столбцов - PullRequest
2 голосов
/ 06 сентября 2011

Мне бы хотелось, чтобы частоты каждого уровня категориальной переменной (вектор-строка) обозначали экологический тип (3 уровня: H, F, T) набора из 93 травянистых растений для наблюдаемых видов (= 1)кондиционирование по участкам (3 уровня: A, B, C), местам обитания (3 уровня: 1,2,3,4) и годам (3 уровня: 1,2,3).

Я знаю, что процедура передается через tapply (), но грязная вещь исходит от логического оператора для связывания уровней категориальной переменной (H, F, T) для данного вида (= 1) через всекондиционирования видов по совокупности факторов столбцов.

Это можно суммировать с помощью таблицы непредвиденных обстоятельств 12 x 3, в которой указаны номера каждого экологического типа (3) видов на участки (3) и места обитания (4).

Пример моих данных (каждая среда обитания содержит 20 строк): для каждого вида (от Sp1 до Sp93) 0 для отсутствующего и 1 для настоящего.Вектор «тип» содержит экологический тип для каждого вида.

Участок, среда обитания, год, Sp1, Sp2, Sp3, Sp4, Sp5, Sp6, ..., Sp93

type = c (H, H, F, T, F, T, H, .... T) # вектор длины 93

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


Надеюсь, это поможетОпишите мои объекты данных лучше.

data = read.csv (file = "Veg_06.csv", header = TRUE)

data = data [1: 240, -c (1,4: 7)]

Коэффициент Ilot # с 3 уровнями «A», «B», «C»: 1 1 1 1 1 1 1 1 1 1 ... каждый уровеньимеет 4 подуровня (из «сайта») по 20 строк в каждой, добавляя до 80 строк по уровням.

Site # Factor с 4 уровнями «Am», «Av», «CP», «CS»: 2 2 2 2 2 2 2 2 2 2 ...

Sp # int [1: 240] 0 0 0 0 0 0 0 0 0 0 ... либо "0", либо "1" дляотсутствие или присутствие видов.

veg # Фактор w / 3 уровня "H", "F", "T": 3 3 2 2 3 1 2 1 2 1 ... категорический фактор, указывающий тип вида.

Ответы [ 2 ]

1 голос
/ 11 мая 2015

Прежде всего, я бы порекомендовал http://vita.had.co.nz/papers/tidy-data.pdf, статью Хэдли Уикхэма о Tidy Data, для некоторых идей о том, как организовать данные, чтобы лучше подходить для анализа. По сути, мы думаем о каждой строке как об одном наблюдении.

Это звучит как фундаментально, ваши данные представляют собой набор year, site, habitat, quadrant (? Может быть line, не уверен из описания), species с точкой наблюдения Существование этого вида наблюдалось в этом месте, среде обитания, квадранте и году. Для простоты есть ряд, если вид присутствует.

Кроме того, существует понятие type, связанное с каждым видом.

Таблица анализа и непредвиденных расходов

Отложив вопрос о том, как получить ваши данные в этой форме, давайте предположим, что у нас есть данные в форме, описанной выше.

> raw <- expand.grid(species=1:93, quadrant=1:20, habitat=1:4, site=1:3, year=1:3)
> head(raw)
  species quadrant habitat site year
1       1        1       1    1    1
2       2        1       1    1    1
3       3        1       1    1    1
4       4        1       1    1    1
5       5        1       1    1    1
6       6        1       1    1    1

А давайте возьмем маленький образец и большой образец

> set.seed(100); d.small <- raw[sample(nrow(raw),20), ]
> set.seed(100); d.large <- raw[sample(nrow(raw),1000), ]

Мы можем использовать функцию ftable, чтобы перевести это в требуемое состояние, таблицу непредвиденных обстоятельств 12x4, как

> ftable(habitat ~ year + site, data=d.small)
          habitat 1 2 3 4
year site
1    1            0 0 1 0
     2            0 0 1 1
     3            0 1 1 1
2    1            2 1 1 0
     2            1 1 0 2
     3            0 0 1 0
3    1            2 0 0 1
     2            0 1 0 1
     3            0 0 0 0

Это будет считать один и тот же вид дважды, если он встречается в двух разных секторах смеси место / среда обитания. Мы можем отказаться от среды обитания и unique указать, чтобы подсчитать по всем из них

> ftable(habitat ~ year + site , data=unique(d.small[c('species', 'habitat','year','site')]))

Преобразование (приведение в порядок исходных данных)

Преобразовать данные в их виде в такую ​​форму сложно в vanilla R. С пакетом tidyr это становится проще (reshape также делает очень похожие вещи)

> onerow <- data.frame(year=1, site=1, habitat=2, quadrant=3, sp1=0, sp2=1,sp3=0,sp4=0,sp5=1)
> onerow
  year site habitat quadrant sp1 sp2 sp3 sp4 sp5
1    1    1       2        3   0   1   0   0   1

Здесь я делаю предположения о том, как выглядят ваши данные, которые кажутся разумными

> subset(gather(onerow, species, present, -(year:quadrant)), present==1)
  year site habitat quadrant species present
2    1    1       2        3     sp2       1
5    1    1       2        3     sp5       1
> subset(gather(onerow, species, present, -(year:quadrant)), present==1, select=-present)
  year site habitat quadrant species
2    1    1       2        3     sp2
5    1    1       2        3     sp5

А теперь вы можете приступить к анализу, приведенному выше.

Объединение данных вида вида

Глядя на ваше описание немного ближе, я думаю, что вы также хотите объединить в параллельном векторе информацию о типовых видах.

> set.seed(100); sp.type <- data.frame(species=1:93, type=factor(sample(1:4, 93, replace=T)))
> merge(d.small, sp.type)
   species quadrant habitat site year type
1        6       16       4    2    3    2
2       27        9       2    2    2    4
3       27        8       4    2    1    4
4       32       18       1    2    2    4
5       33       18       1    1    2    2
6       45       14       4    2    2    3
7       49        6       2    3    1    1
8       54        3       3    2    1    2
9       55        2       1    1    3    3
10      56        2       4    3    1    2
11      56        1       3    1    1    2
12      57        7       2    1    2    1
13      62       18       4    2    2    3
14      70       19       1    1    2    3
15      77        2       3    3    1    4
16      80        7       3    1    2    1
17      81       17       1    1    3    2
18      82        5       2    2    3    3
19      86        9       4    1    3    3
20      87       10       3    3    2    3

И теперь вы можете использовать подходы subset, unique и ftable, описанные выше, чтобы получить необходимые данные.

0 голосов
/ 06 сентября 2011

Предполагая, что у вас есть фрейм данных с (среди прочего) столбцами с именами: "sites", "Место обитания", "years":

dfrm <- data.frame( sites = sample( LETTERS[1:3], 20, replace=TRUE),
            habitats= sample( factor(1:4), 20, replace=TRUE),
            years = sample( factor(paste("Y",1:4, sep="_")), 20, replace=TRUE) )

Тогда это даст вам дополнительный столбец факторного режимаэто кодирует различные уровни каждой строки.

dfrm$three.way.inter <- with(dfrm, interaction(sites, habitats, years))

Если вы хотите, чтобы не заполненные уровни не делали ничего другого.Если вы хотите возможные уровни, у которых нет экземпляров, используйте drop = TRUE.Затем вы можете проанализировать их на отдельных уровнях трех классификационных переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...