3 votes

boucle : sélection de la variable pour la fonction de corrélation dans r

Voici ce que j'ai l'intention de faire (pour un nombre assez important de variables et un ensemble de données) :

mygroupdf <- data.frame (varname = c("A", "B", "c1", "D2",
    "E", "F", "g1"), group = c(1, 1, 1, 2,3,3,4))

> mygroupdf
      varname group
  1       A     1
  2       B     1
  3      c1     1
  4      D2     2
  5       E     3
  6       F     3
  7      g1     4

Ce cadre de données ne contient que des informations pour le regroupement des variables :

group 1 = A, B, c1
group 2 = D2
group 3 = E, F
group 4 = g1

Deuxième ensemble de données - contient les données réelles

set.seed(1234)
dataf <- data.frame (yvar = rnorm (10, 10,3), 
    A = sample(c(1,0), 10, T), B = sample(c(1,0), 10, T), 
    c1 = sample (c(1,0), 10, T), D2 = sample (c(1,0), 10, T), 
    E= sample (c(1,0), 10, T),F = sample (c(1,0), T), 
    g1 = sample (c(1,0), 10, T))

# manual workout:
xtemp <- dataf$A* dataf$B * dataf$c1 # all from group 1
# I error in previous version it is * not + 
# (is product of all members of a group i.e. 
 xtemp <- dataf$D2 (- group 2)
 xtemp <- dataf$E * dataf$F (- group 3)
 xtemp <- dataf$G (- group 4)

Puis corrélation du produit avec Yvar :

x <- cor(dataf$yvar, xtemp)

Je veux l'envelopper dans une fonction afin de pouvoir l'appliquer aux 1000 groupes de variables de mon ensemble de données.

   corrfun <- function (x, V1, V2, V3) {
           xtemp <- V1 * V2  + V3
           x <- cor(dataf$yvar, xtemp)
           return (x)
          }

Comme les différents groupes ont des variables différentes, je ne sais pas comment construire une telle fonction et l'appliquer à l'ensemble des données. Aidez-moi s'il vous plaît !

Edits : processus :

enter image description here

3voto

Justin Points 19077

Je vais parier une supposition...

corrfun <- function (group.no, x=dataf, x.lookup=mygroupdf) {
  xtemp <- apply(x[x.lookup$varname[x.lookup$group == group.no]], 1, prod)

  out <- cor(x$yvar, xtemp)

  return (out)
}

>     corrfun(1)
[1] 0.35593
> corrfun(2)
[1] 0.4181311
>

0voto

lockedoff Points 513

Une autre réponse..

cbind(
  group = unique(mygroupdf$group),
  corr = 
    do.call(
      c,
      lapply(
        unique(mygroupdf$group),
        function(x) {
          varnames <- unique(mygroupdf[mygroupdf$group == x, 'varname'])
          products <- apply(as.matrix(dataf[, colnames(dataf) %in% varnames]), 1, prod)
          cor(products, dataf$yvar)
        }
      )
    )
)

ce qui donne

     group       corr
[1,]     1  0.3559300
[2,]     2  0.4181311
[3,]     3         NA
[4,]     4 -0.1015003

0voto

MvG Points 22342
sapply(unique(mygroupdf$group), function(x) {
  a <- as.character(mygroupdf$varname[mygroupdf$group == x])
  cor(dataf$yvar, apply(dataf[a],1,prod))
})
  1. unique : identifier des numéros de groupe uniques
  2. sapply : à chacun d'eux, appliquer la fonction
  3. a <- : let a sont les noms des variables correspondantes
  4. dataf[a] : choisir les colonnes appropriées dans le cadre de données
  5. appliquer( prod) : calculer le produit pour chaque ligne
  6. cor : corréler
  7. sapply : combiner les résultats en un vecteur simple

0voto

MvG Points 22342

Et pour créer une autre réponse en utilisant ma bibliothèque préférée actuelle :

library(plyr)
ddply(mygroupdf, .(group), summarise,
      cor=cor(dataf$yvar, apply(dataf[as.character(varname)],1,prod)))

Cela donnera le résultat suivant :

  group        cor
1     1  0.3559300
2     2  0.4181311
3     3         NA
4     4 -0.1015003
Warning message:
In cor(dataf$yvar, apply(dataf[as.character(varname)], 1, prod)) :
  the standard deviation is zero

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X