Эквивалентный код в R для оператора "by" в SAS, чтобы запустить несколько ANOVA на разных уровнях переменной. - PullRequest
0 голосов
/ 27 мая 2020

Я хотел бы запустить линейную модель общего улова каждого вида по местоположению. Данные выглядят следующим образом:

Location REP TRAP SpeciesID Total
A1 A1_1 A1_1_1 Calaingr 5.288462
A1 A1_1 A1_1_1 Carataed 1.057692
A1 A1_1 A1_1_1 Harpfulv 1.057692
…

Модель представляет собой очень простую модель: C_AOV <- lmer (Total ~ Location + (1 | REP)). Поэтому я считаю, что Location является фиксированным эффектом, а Rep - случайным. модель для каждого уровня SpeciesID, таким образом, выводя 54 отдельных ANOVA, по одному для каждого вида. Есть ли эквивалентный способ сделать это в R? Я попытался поискать в Интернете, но не нашел метода, который мог бы понять. Я видел пакет plyr и несколько примеров, но не понимаю, что они делают. Спасибо, сб </p>

1 Ответ

0 голосов
/ 28 мая 2020

Я могу говорить от имени R, который будет немного более подробным, чем оператор by в процедурах SAS. Как правило, парадигма разделяется, применяется, объединяется. У вас будет как минимум два следующих варианта. Предположим, у вас есть данные, хранящиеся как объект df. На самом деле я не запускал никакой из этого кода.

Tidyverse и Broom

Это будет не так интуитивно понятно с операторами трубы '%>%' и tidyverse lin go. Однако, вероятно, это один из наиболее кратких способов сделать это.

# Not run    
library(tidyverse)

library(broom)

models <- df %>% 
 nest(-SpeciesID) %>% 
 mutate(fit = map(data, ~ lmer(Total~Location + (1|REP), data = .),
        results = map(fit, glance))%>%
 unnest(results)

models %>% select(-fit, -data)

Split, Apply, Combine in al oop

ИМХО, конструкция цикла упрощает понимание.

#Not run    
split <- split(df, SpeciesID)

models <- list()

for (i in 1:length(split)) {
 model_df <- split[[i]]
 models[[i]] <-  lmer(Total~Location + (1|REP), data=model_df)
}

sapply(1:length(models), function(x) {summary(models[[x]]})

Базовый метод применения R

Этот метод довольно краток и снова подчеркивает, как функция lmer «применяется» к различным подмножествам данных. Функция (x) является анонимной функцией, где x является своего рода итератором на всех уровнях df $ SpeciesID.

by(df,df$SpeciesID, function(x) summary(lmer(Total~Location + (1|REP),data = x))) 

* Решение из комментария Onyambu

Я уверен, что есть другие альтернативы, но я надеюсь, что это поможет. Для человека, который перешел с SAS в основном на R, это, несомненно, одна из вещей, которые SAS упрощает; Функции моделирования R редко имеют параметр, аналогичный предложению SAS by.

...