Есть ли способ выполнить цикл регрессии по подмножеству?

#r #loops

#r #циклы

Вопрос:

Для проекта регрессии я создал кластеры данных через nbclust, используя kmeans. В настоящее время в этом проекте 4 кластера, но в случае успеха проект может включать анализ нескольких городов США. Хотя я мог бы построить каждую регрессию вручную, я бы предпочел свести к минимуму объем кода и, следовательно, возможность ошибок при кодировании.

Текущая модель использует glm с несколькими подмножествами и 10-15 различными независимыми переменными. В настоящее время я создаю каждую кластерную регрессию вручную.

 Tulsa$Cluster <- Tulsa$Best.partition
#This creates a vector of clusters; there are currently 4 distinct clusters

summary(Tulsa_Cluster1 <- glm(formula = Tulsa$Result ~ Tulsa$FactorA Tulsa$FactorB   Tulsa$FactorC   Tulsa$FactorD   Tulsa$FactorE   Tulsa$FactorF, 
                              method = "glm.fit", family = gaussian(),subset = Tulsa$Cluster =="1"))

summary(Tulsa_Step <- stepAIC(Tulsa_Cluster1, direction = "both",trace = FALSE, 
                              scope=list(lower = ~ Tulsa_Cluster1$FactorA)))
  

Я надеюсь разработать регрессию по кластерам, которую я затем смогу обобщить.

Комментарии:

1. Какую часть summary строк нужно будет зациклить?

2. Parfait — оба утверждения. Первое утверждение является «базовой» регрессией для кластера. Второй оператор — это пошаговая регрессия, которая запускается, как только выполняется начальная регрессия.

Ответ №1:

Рассмотрите любой из следующих подходов, используя unique , levels , split и by для перебора уникальных значений кластера:

unique for

 for (c in unique(Tulsa$Cluster)) {
   Tulsa_Cluster <- glm(formula = Result ~ FactorA   FactorB   FactorC   FactorD   FactorE   FactorF, 
                        data = Tulsa, method = "glm.fit", family = gaussian(), subset = Cluster == c)
   print(summary(Tulsa_Cluster))  # REQUIRED IN for LOOPS TO FOR CONSOLE OUTPUT

   Tulsa_Step <- stepAIC(Tulsa_Cluster, direction = "both", trace = FALSE, 
                         scope=list(lower = ~ Tulsa_Cluster$FactorA))
   print(summary(Tulsa_Step))     # REQUIRED IN for LOOPS TO FOR CONSOLE OUTPUT
}
  

levels for

 for (c in levels(factor(Tulsa$Cluster))) {
   Tulsa_Cluster <- glm(formula = Result ~ FactorA   FactorB   FactorC   FactorD   FactorE   FactorF, 
                        data = Tulsa, method = "glm.fit", family = gaussian(), subset = Cluster == c)
   print(summary(Tulsa_Cluster))

   Tulsa_Step <- stepAIC(Tulsa_Cluster, direction = "both", trace = FALSE, 
                         scope=list(lower = ~ Tulsa_Cluster$FactorA))
   print(summary(Tulsa_Step))
}
  

Ниже два возвращает именованный список объектов.

split lapply (нет аргументов подмножества)

 data_list <- split(Tulsa, Tulsa$Cluster)

model_list <- lapply(data_list, function(sub_df) {
   Tulsa_Cluster <- glm(formula = Result ~ FactorA   FactorB   FactorC   FactorD   FactorE   FactorF, 
                        data = sub_df, method = "glm.fit", family = gaussian())

   Tulsa_Step <- stepAIC(Tulsa_Cluster, direction = "both", trace = FALSE, 
                         scope=list(lower = ~ Tulsa_Cluster$FactorA))

   # RETURN BOTH SUMMARIES INTO LIST
   return(list(Tulsa_Cluster, Tulsa_Step))
})
  

by (нет аргументов подмножества)

 model_list <- by(Tulsa, Tulsa$Cluster, function(sub_df) {
   Tulsa_Cluster <- glm(formula = Result ~ FactorA   FactorB   FactorC   FactorD   FactorE   FactorF, 
                        data = sub_df, method = "glm.fit", family = gaussian())

   Tulsa_Step <- stepAIC(Tulsa_Cluster, direction = "both", trace = FALSE, 
                         scope=list(lower = ~ Tulsa_Cluster$FactorA))

   # RETURN BOTH SUMMARIES INTO LIST
   return(list(Tulsa_Cluster, Tulsa_Step))
})
  

Комментарии:

1. Спасибо! Это потрясающе, и я действительно ценю вашу помощь.