2017-10-16 6 views
0

J'ai une trame de données R avec deux colonnes, colA et colB, et un objet glm ajusté. Maintenant, je peux utiliser prédire avec le dataframe et l'objet glm pour prédire les résultats. Cependant, je voudrais également prédire les résultats pour colB + 0.1, colB + 0.2, colB + 0.3, etc.Carte (purrr) pour ajouter une plage de nombres à une colonne une par une

Je pensais faire cela avec map (paquetage purrr), mais je ne sais pas comment. Ce que j'ai essayé jusqu'à présent est de créer un vecteur:

library(tibble) 
range <- data_frame(colC = seq(-1, 1, by=0.1)) 

Maintenant, je ne peux pas comprendre comment faire:

  1. Ajouter le premier élément de colC à tous les éléments de colB
  2. ensuite prédire() sur colA et colB avec l'objet GLM
  3. Groupe ce résultat par colA et l'enregistrer dans un nouveau vecteur
  4. Répétez 1-3 pour les prochains éléments colC et ajouter les résultats au nouveau vecteur, pour que ce nouveau vect ou a colC et la colB prédite et groupée.

J'espère que ma question est claire. Est-ce que quelqu'un sait comment faire cela? Par ailleurs, il n'a pas besoin d'être avec purrr.

Répondre

0

J'ai créé une solution simple en utilisant une fonction afin que vous puissiez faire cela pour toutes les trames de données (data) et toute séquence de valeurs ajoutées (add) à "colB".

# data has a column named 'colB' from which we cant to predict with added values. 
# add is the vector of adding values to colB 
'glm_add' <- function(data, add = seq(0.1, by = 0.1, length.out = nrow(data))){ 
    data <- cbind.data.frame(data, colB_add = data$colB + add) 

    glm <- glm(colA ~ colB, data = data) 
    glm_add <- glm(colA ~ colB_add, data = data) 

    pred <- predict(glm, data) 
    pred_add <- predict(glm_add, data) 

    return(list(pred = pred, pred_add = pred_add)) 
} 

reproduire, par exemple, pour tester la fonction:

data <- data.frame(colA = rnorm(10), colB = rnorm(10)) 
res <- glm_add(data) 

prédictions de la glm avec le "initial colB" comme covariable:

> res$pred : 
     1   2   3   4   5   6   7   8   9   10 
0.13415502 0.17283282 0.27074470 0.47279826 0.01846426 0.13072748 0.21737383 0.12426569 0.25197290 0.30230644 

prédictions de la glm avec colB + 0,1 , colB + 0,2, colB + 0,3, ... comme covariable:

> res$pred_add 
      1   2   3   4   5   6   7   8   9   10 
0.19407251 0.23911968 0.39659313 0.75172751 -0.13896182 0.04575049 0.18184197 -0.02324061 0.19078440 0.25795416 

EDIT:

L'auteur a demandé en fait de prédire à partir des trames de données modifiées où colB_add a chacun de ses éléments ont été ajoutés la même valeur 0,1, puis 0,2, etc.

Pour ce faire, , Je vais utiliser lapply() pour créer un data_list où chaque élément est une base de données avec la colonne colB_add appropriée.

add <- seq(0.1, by = 0.1, length.out = nrow(data)) 
data_list <- lapply(1:length(add), function(i) cbind.data.frame(data, colB_add = data$colB + add[i])) 

Ensuite, je mets chaque prédictions dans une liste

pred_list <- list() 
> lapply(1:length(add), function(x){ 
+ glm <- glm(colA ~ colB_add, data = data_list[[x]]) 
+ pred_list[[x]] <<- predict(glm, data_list[[x]]) 
+ }) 
[[1]] 
      1   2   3   4   5   6   7   8   9   10 
-0.25321920 0.93795112 -0.04791986 -0.51229077 -0.20971718 0.36441752 0.38477508 -0.26853199 -0.00754999 0.04868279 

[[2]] 
      1   2   3   4   5   6   7   8   9   10 
-0.25321920 0.93795112 -0.04791986 -0.51229077 -0.20971718 0.36441752 0.38477508 -0.26853199 -0.00754999 0.04868279 

[[3]] 
      1   2   3   4   5   6   7   8   9   10 
-0.25321920 0.93795112 -0.04791986 -0.51229077 -0.20971718 0.36441752 0.38477508 -0.26853199 -0.00754999 0.04868279 

Notez que cela donne les mêmes prédictions pour chaque trame de données modifiées. Ceci est évident à partir de la théorie sur les modèles linéaires puisque chaque covariable change par le même facteur.

+0

Merci pour votre réponse, mais cela ajoute le premier élément de 'add' au premier élément de 'colB', le second au second, etc. Je voudrais ajouter le premier élément de 'add' à TOUS les éléments de colB, puis calculer prédire et enregistrer le résultat, puis ajouter le deuxième élément de 'ajouter' à tous les éléments de colB et recalculer prédire et enregistrer le résultat, etc – Z117

+0

J'ai édité! (va supprimer ce commentaire) –