Programmer une fonction à coefficients variables

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Nicolas Giraud
Messages : 25
Enregistré le : 21 Juin 2018, 07:00

Programmer une fonction à coefficients variables

Messagepar Nicolas Giraud » 25 Juil 2018, 14:21

Bonjour,

J'ai un tableau de données avec A, B, C, ..., et G des valeurs (colonnes) affectées à des individus (lignes).
Soit la fonction "note" pour calculer des notes d'individus selon ces critères. A chaque critère est affecté un coefficient (a,b,c,d,e,f,g):

Code : Tout sélectionner

note <- function(a,b)
{
   #expression de l'index de sélection
  N <- a*A- b*B - (c*C+ d*D+ e*E+ f*F+ g*G)
 
}

N <-note(a, b, c, d, e, f, g) 
N


Je souhaite intégrer à cette fonction le fait que a, b, c, d, e, f et g appartiennent à l'intervalle [0;10] pour que R me calcule tous les résultats possibles.
Par exemple, note (0,0, 0, 0, 0, 0, 1) et ainsi de suite. Je ne trouve pas la manipulation / la formulation pour réaliser ceci dans la fonction programmée pour que R me sorte un tableau des individus auxquels sont affectées les notes selon toutes les possibilités d'association de coefficients.

Des astuces ?

En vous remerciant par avance,

Bien cordialement,
Nicolas

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Programmer une fonction à coefficients variables

Messagepar Eric Casellas » 25 Juil 2018, 15:17

Bonjour,

voici 2 propositions avec l'hypothèse que les coeff a, b, .. ne prennent que des valeurs entières (sinon il y a une infinité de possibilités, en tout cas il faut au moins discrétiser le nombre de valeurs)

Code : Tout sélectionner

mydta <- data.frame(A=rnorm(100), B=rnorm(100))

note <- function(dta, a,b) {
  a*dta$A- b*dta$B
}

note(mydta, 1, 0)

note_range <- function(dta, a_range=1:10, b_range=1:10) { #dta <- mydta
  notes <- data.frame(matrix(ncol = length(a_range)*length(b_range), nrow = nrow(dta)))
  notescolnames <- vector(mode = "character", length = length(a_range)*length(b_range))
  i =1
  for (aa in a_range) {
    for (bb in b_range) {
      notes[,i] <- note(dta, aa, bb)
      notescolnames[i] <- paste("a=", aa, "b=", bb)
      i <- i+1
    }
  }
  colnames(notes) <- notescolnames
  return(notes)
}

note_range(mydta)


note_range2 <- function(dta, a_range=1:10, b_range=1:10) { #dta <- mydta
  notes <- data.frame(matrix(ncol = length(a_range)*length(b_range), nrow = nrow(dta)))
  notescolnames <- vector(mode = "character", length = length(a_range)*length(b_range))
  coeffs <- expand.grid(a=a_range, b=b_range)
  notes <- sapply(1:nrow(coeffs), function(i) {note(dta, coeffs$a[i], coeffs$b[i])})
  colnames(notes) <- sapply(1:nrow(coeffs), function(i) {paste("a=", coeffs$a[i], "b=", coeffs$b[i])})
  return(notes)
}

note_range2(mydta)
Eric

Nicolas Giraud
Messages : 25
Enregistré le : 21 Juin 2018, 07:00

Re: Programmer une fonction à coefficients variables

Messagepar Nicolas Giraud » 26 Juil 2018, 13:36

Bonjour Eric,

Merci pour vos propositions. Elles fonctionnent effectivement et me font gagner beaucoup de temps !

Bonne fin de journée,
Nicolas

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Programmer une fonction à coefficients variables

Messagepar Logez Maxime » 26 Juil 2018, 22:19

Bonjour,

Dans un cas comme celui-là j'aurai tendance à n'utiliser que des matrices et la fonction colSums :

Code : Tout sélectionner

dta <- data.frame(A = rnorm(10), B = rnorm(10))

coefs <- expand.grid(a = 1:10, b = 1:10)

# passage en matrice transposées

dta2 <- t(dta)
coefs2 <- t(coefs)
# multiple le vecteur de coefficient par un vecteur du signe de ces coeffs (au besoin)
coefs2 <- coefs2 * c(1, -1) # parque a*A -b*B (b négatif)

res <- matrix(numeric(), nrow(dta), ncol(coefs2))
for (i in 1:ncol(coefs2))
  res[,i] <- colSums(dta2*coefs2[,i])

# si tu as besoin des étiquettes :
colnames(res) <- do.call(sprintf, c(paste(paste(LETTERS[1:ncol(coefs)], "=", "%s"), collapse=", "), as.list(coefs)))
Cordialement,
Maxime

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Programmer une fonction à coefficients variables

Messagepar Logez Maxime » 27 Juil 2018, 09:32

Bonjour,

Bon écrire des trucs tard le soir c'est pas toujours une bonne idée, il y a bien plus simple que de passer par la boucle et le colSums : la multiplication matricielle :

Code : Tout sélectionner

dta <- data.frame(A = rnorm(10), B = rnorm(10))

coefs <- expand.grid(a = 1:10, b = 1:10)

# passage en matrice transposées

dta2 <- as.matrix(dta)
coefs2 <- t(coefs)
# multiple le vecteur de coefficient par un vecteur du signe de ces coeffs (au besoin)
coefs2 <- coefs2 * c(1, -1) # parque a*A -b*B (b négatif)

res <- dta2%*%coefs2

colnames(res) <- do.call(sprintf, c(paste(paste(LETTERS[1:ncol(coefs)], "=", "%s"), collapse=", "), as.list(coefs)))
En plus si tu utilises certaines distribution de R (Micros... R Open avec les librairies MKL) alors tu vas paralléliser ton calcul matriciel sans t'en rendre compte et le temps de calcul sera bien plus faible.

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité