2017-08-15 3 views
-1

Je cherche à exécuter la régression linéaire sur la trame de données ci-dessous.Itérer sur les variables pour la régression linéaire dans R

test<-data.frame(abc=c(2.4,3.2,8.9,9.8,10.0,3.2,5.4), 
      city1_0=c(5.3,2.6,3,5.4,7.8,4.4,5.5), 
      city1_1=c(2.3,5.6,3,2.4,3.6,2.4,6.5), 
      city1_2=c(4.2,1.4,2.6,2,6,3.6,2.4), 
      city1_3=c(2.4,2.6,9.4,4.6,2.5,1.2,7.5), 
      city1_4=c(8.2,4.2,7.6,3.4,1.7,5.2,9.7), 
      city2_0=c(4.3,8.6,6,3.7,7.8,4.7,5.8),           city2_1=c(5.3,2.6,3,5.4,7.8,4.4,5.5)) 

La "donnée" de données est un échantillon des données. Mais le cadre de données d'origine contient 100 colonnes. Je veux créer un script pour prédire des valeurs en utilisant la régression linéaire. Dans ce cas, je veux construire de nombreux modèles avec différentes variables d'entrée. Par exemple, dans la trame donnée, abc est la variable y. Je veux construire un modèle city1_1, city1_2, city1_3, city1_4 (en laissant city1_0, city2_0). Puis un autre modèle avec city1_2, city1_3, city1_4 (en laissant city1_0, city1_1, city2_0, city2_1) et ensuite le 3ème modèle avec la variable d'entrée city1_3, city1_4 (en laissant city1_0, city1_1, city1_2, city2_0, city2_1), et ainsi de suite.

Ces variables sont toutes entrées dans la régression linéaire.

Je dois le faire pour 40 bases de données. Le nom de la variable O/P reste le même pour toutes les données.

+0

Quel est le modèle pour les combinaisons que vous voulez essayer? Une approche courante consiste à coller des noms de variables ensemble en tant que chaînes, puis 'lapply (string_formulas, function (forme) {lm (as.formule (forme), data = df})' Cela dit, une approche plus approfondie de la sélection de le LASSO peut être une meilleure idée – alistaire

+0

@allstaire, En fait, Quand j'utilise toutes les variables 1 suffixées, je ne veux pas utiliser 0 variables suffixées dans mon modèle, et quand j'utilise 2 variables suffixées, je ne fais pas Je veux vouloir utiliser les variables suffixées de 0 et de 1 dans mon 2ème modèle et ainsi de suite .. Fondamentalement, je dois construire beaucoup de modèles multiples basés sur les variables Comment implémenter ceci – User0590

+0

Ceci est un repost exact d'une question antérieure. pour faire du travail pour obtenir le code de base, puis demander de l'aide – sconfluentus

Répondre

0

Vous pouvez créer une liste de formules utilisant l'expression régulière, puis lapply sur cette liste:

# create data 
test<-data.frame(abc=c(2.4,3.2,8.9,9.8,10.0,3.2,5.4), 
      city1_0=c(5.3,2.6,3,5.4,7.8,4.4,5.5), 
      city1_1=c(2.3,5.6,3,2.4,3.6,2.4,6.5), 
      city1_2=c(4.2,1.4,2.6,2,6,3.6,2.4), 
      city1_3=c(2.4,2.6,9.4,4.6,2.5,1.2,7.5), 
      city1_4=c(8.2,4.2,7.6,3.4,1.7,5.2,9.7), 
      city2_0=c(4.3,8.6,6,3.7,7.8,4.7,5.8),           
      city2_1=c(5.3,2.6,3,5.4,7.8,4.4,5.5)) 

# create list of formulas 
myformulas <- list(as.formula(paste("abc", paste(grep("city1_[123456789]", names(test), value = TRUE), collapse = " + "), sep = " ~ ")), 
        as.formula(paste("abc", paste(grep("city1_[23456789]", names(test), value = TRUE), collapse = " + "), sep = " ~ ")), 
        as.formula(paste("abc", paste(grep("city1_[3456789]", names(test), value = TRUE), collapse = " + "), sep = " ~ "))) 

# check formulas 
> myformulas 
[[1]] 
abc ~ city1_1 + city1_2 + city1_3 + city1_4 

[[2]] 
abc ~ city1_2 + city1_3 + city1_4 

[[3]] 
abc ~ city1_3 + city1_4 


# loop over formulas 
mylms <- lapply(myformulas, function(x) lm(x, data = test)) 


# get output of linear regressions 
> mylms 
[[1]] 

Call: 
lm(formula = x, data = test) 

Coefficients: 
(Intercept)  city1_1  city1_2  city1_3  city1_4 
    5.8987  -0.2480  0.6316  1.1810  -1.0420 


[[2]] 

Call: 
lm(formula = x, data = test) 

Coefficients: 
(Intercept)  city1_2  city1_3  city1_4 
    4.8903  0.7114  1.1673  -1.0595 


[[3]] 

Call: 
lm(formula = x, data = test) 

Coefficients: 
(Intercept)  city1_3  city1_4 
     7.909  1.047  -1.102 

Vous pouvez même prespecify les grep() modèles et de créer les formules avec une boucle:

mygreps <- c("city1_[123456789]", "city1_[23456789]", "city1_[3456789]") 

myformulas <- lapply(mygreps, function(x) as.formula(paste("abc", paste(grep(x, names(test), value = TRUE), collapse = " + "), sep = " ~ "))) 

Modifier:

Vous pouvez Il suffit également de définir la plage de valeurs des variables city et d'utiliser paste() pour générer les chaînes.

Exemple:

myranges <- lapply(1:16, function(x) x:16) 
myvars <- paste0("city", 1:10, "_") 

Ensuite, à partir de cela, créez les formules avec un appel lapply() imbriqué:

myformulas <- lapply(myvars, function(x) lapply(myranges, function(y) as.formula(paste("abc", paste(x, y, sep = "", collapse = " + "), sep = " ~ ")))) 

myformulas comprendra maintenant 10 listes (une pour chaque city1_-city10_) avec 16 formules dans chaque liste (chacun incluant une quantité décroissante de variables, commençant par les 16, et se terminant par cityX_16).

Maintenant, juste boucle sur myformulas pour obtenir une liste de sortie de régression linéaire:

# loop over formulas 
mylms <- lapply(myformulas, function(x) lapply(x, function(y) lm(y, data = test))) 
+0

Merci pour la solution.Mais j'ai une variable à partir de city1_1 ..... city1_16 jusqu'à city10_1 ....... city10_16. Comment gérer cela dans ce code? Parce que chaque fois que l'on écrit un nom de ville n'est pas réalisable. Cela prendra une éternité. – User0590

+0

J'ai modifié une autre version. Cela crée une liste de formules pour les 10 variables de ville, avec 16 formules chacune (commençant par tout 'cityX_1' à' cityX_16' et se terminant par seulement 'cityX_16' comme prédicteurs). – LAP

+0

merci beaucoup, Lap !! – User0590