Есть ли способ зациклить регрессию по подмножеству? - PullRequest
0 голосов
/ 02 апреля 2019

Для регрессионного проекта я создал кластеры данных через 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 Ответ

1 голос
/ 02 апреля 2019

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

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))
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...