Объединить l oop и строковый ввод для формирования имени столбца в R - PullRequest
1 голос
/ 04 февраля 2020

Я бы хотел провести oop через ряд линейных вероятностных моделей. Как прокси для моих собственных данных, я воссоздаю контекст, используя набор данных iris.

library(tidyverse)
library(fastDummies)
data(iris)

iris <- iris %>% 
  dummy_cols("Species")

names(iris)
[1] "Sepal.Length"       "Sepal.Width"        "Petal.Length"       "Petal.Width"        "Species"           
[6] "Species_setosa"     "Species_versicolor" "Species_virginica" 

В этом примере я начинаю с загрузки данных, а затем определяю две независимые линейные модели вероятности, сравнивая или "лишай" или "virginica" в "setosa" в качестве моего контрольного уровня. Эти модели легко запускаются независимо.

# model 1
iris %>%
  filter(Species %in% c("setosa", "versicolor")) %$%
  lm(Species_versicolor ~ Sepal.Length, data = .)

Call:
lm(formula = Species_versicolor ~ Sepal.Length, data = .)

Coefficients:
 (Intercept)  Sepal.Length  
     -2.6203        0.5703  

# model 2
iris %>%
  filter(Species %in% c("setosa", "virginica")) %$%
  lm(Species_virginica ~ Sepal.Length, data = .)

Call:
lm(formula = Species_virginica ~ Sepal.Length, data = .)

Coefficients:
 (Intercept)  Sepal.Length  
      -2.092         0.447 

Но я бы хотел ускорить процесс и l oop через уровни видов. Вот пример того, что я воображаю для процесса.

for (i in c("versicolor", "virginica")) {
  model <- iris %>%
    filter(Species %in% c("setosa", i)) %$%
    lm(paste0("Species_", i) ~ Sepal.Length, data = .)
}

Проблема с этим кодом заключается в том, что lm не распознает результат функции paste0 как имя столбца и предоставляет следующая ошибка:

Error in model.frame.default(formula = paste0("Species_", i) ~ Sepal.Length,  : 
  variable lengths differ (found for 'Sepal.Length')

Есть ли способ объединить l oop и строковые данные для формирования имени столбца в R, которое будет распознаваться lm? Или, возможно, существует обходной путь, который не меняет кардинально формат оригинальных моделей?

Спасибо за помощь!

1 Ответ

2 голосов
/ 04 февраля 2020

formula не завершено. Используя функции tidyverse, выход вернется в list во время цикла с map

library(dplyr)
library(purrr)
library(stringr)
lst1 <- map(c("versicolor", "virginica"), ~
          iris %>%
            filter(Species %in% c("setosa", .x)) %>%  
             lm(reformulate("Sepal.Length", 
                  response = str_c("Species_", .x)), data = .))

Если мы используем for l oop, обязательно назначьте вывод в list создан

lst2 <- vector('list', 2)
names(lst2) <- c("versicolor", "virginica")
for (val in names(lst2)) {
   lst2[[val]] <- iris %>%
        filter(Species %in% c("setosa", val)) %>%
         lm(as.formula(paste0("Species_", val, " ~ Sepal.Length")), data = .)
    }

lst2
#$versicolor

#Call:
#lm(formula = as.formula(paste0("Species_", val, " ~ Sepal.Length")), 
#   data = .)



#Coefficients:
# (Intercept)  Sepal.Length  
#     -2.6203        0.5703  


#$virginica

#Call:
#lm(formula = as.formula(paste0("Species_", val, " ~ Sepal.Length")), 
#   data = .)



#Coefficients:
# (Intercept)  Sepal.Length  
#      -2.092         0.447  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...