affectations "à la main" suite à une analyse discr

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

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

affectations "à la main" suite à une analyse discr

Messagepar Couanais Pierre » 04 Déc 2012, 17:27

Bonjour à tous,

J'ai réalisé une analyse discriminante sur des données (25 000 lignes 2 colonnes), avec échantillons témoin et test etc ... avec la fonction fda du package mda.

Je prédis alors mes données test avec predict et vois les résultats avec confusion.

Or, ce que je souhaiterais, c'est implémenter mes prévisions dans un fichier excel et donc j'aimerais savoir comment calculer à la main les classes de mes individus à prévoir.

Merci d'avance

Charlène Joannès
Messages : 5
Enregistré le : 24 Oct 2012, 13:26

Messagepar Charlène Joannès » 05 Déc 2012, 07:28

Salut,

Si j'ai bien compris, tu as aujourd'hui 25 000 individus. Grâce à ton analyse discriminante, tu as réussi à les classer selon combien de groupes ?

Ta problématique, c'est de mettre en place un système de calcul automatique sous excel, quand ton nombre d'individus augmentera, c'est bien ça ? Pourquoi cherches-tu a calculer l'attribution de tes individus à des classes "à la main" ? Est-ce par souci de gain de temps ? (Je rentre mes données dans excel et la grâce à mes formules prêtes à l'emploi, tout se calcule automatiquement).

Je pense que tu serais gagnant à refaire tourner à chaque fois ton analyse discriminante, car tu gagneras en précision et ton taux d'erreur de prédiction devrait s'en trouver amélioré. Je laisse d'autres utilisateurs confirmer...

Si tu souhaites travailler sous excel, tu peux essayer R-excel... je ne sais pas si tu connais XLstats. R-excel fonctionne sur le même principe. Tu peux charger des fonctions de R sous un environnement excel (un bandeau est intégré dans le menu d'excel).

En espérant avoir (en partie) répondu à ta question...

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 05 Déc 2012, 10:12

Salut Charlène, merci pour ta réponse.
Je précise mon souhait alors.

J'ai 25 000 individus, classés en 4 classes.
Je fais une analyse discriminante de façon à prévoir de nouveaux individus.

Mais cette prévision je souhaite l'implémenter automatiquement, donc j'aimerais avoir les coefficients, et les règles d'attribution à telle ou telle classe, pour classer mes futurs observations. Sans passer par R

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

Messagepar Logez Maxime » 05 Déc 2012, 10:35

Bonjour,

tout est dans le code de la fonction predict.fda. Il te faudra l'éplucher pour refaire les choses toi même.

Code : Tout sélectionner

function (object, newdata, type = c("class", "variates", "posterior",
    "hierarchical", "distances"), prior, dimension = J - 1, ...)
{
    dist <- function(x, mean, m = ncol(mean)) (scale(x, mean,
        FALSE)^2) %*% rep(1, m)
    type <- match.arg(type)
    means <- object$means
    Jk <- dim(means)
    J <- Jk[1]
    k <- Jk[2]
    if (type == "hierarchical") {
        if (missing(dimension))
            dimension.set <- seq(k)
        else {
            dimension.set <- dimension[dimension <= k]
            if (!length(dimension.set))
                dimension.set <- k
            dimension <- max(dimension.set)
        }
    }
    else dimension <- min(max(dimension), k)
    if (missing(newdata))
        y <- predict(object$fit)
    else {
        if (inherits(newdata, "data.frame") || is.list(newdata)) {
            Terms <- delete.response(terms(object))
            attr(Terms, "intercept") <- 0
            newdata <- model.matrix(Terms, newdata)
        }
        y <- predict(object$fit, newdata)
    }
    y <- y %*% object$theta[, seq(dimension), drop = FALSE]
    lambda <- object$values
    alpha <- sqrt(lambda[seq(dimension)])
    sqima <- sqrt(1 - lambda[seq(dimension)])
    newdata <- scale(y, FALSE, sqima * alpha)
    if (missing(prior))
        prior <- object$prior
    else {
        if (any(prior < 0) | round(sum(prior), 5) != 1)
            stop("innappropriate prior")
    }
    means <- means[, seq(dimension), drop = FALSE]
    switch(type, variates = return(newdata), class = {
        n <- nrow(newdata)
        prior <- 2 * log(prior)
        mindist <- dist(newdata, means[1, ], dimension) - prior[1]
        pclass <- rep(1, n)
        for (i in seq(2, J)) {
            ndist <- dist(newdata, means[i, ], dimension) - prior[i]
            l <- ndist < mindist
            pclass[l] <- i
            mindist[l] <- ndist[l]
        }
        return(factor(pclass, levels = seq(J), labels = dimnames(means)[[1]]))
    }, posterior = {
        pclass <- matrix(0, nrow(newdata), J)
        for (i in seq(J)) pclass[, i] <- exp(-0.5 * dist(newdata,
            means[i, ], dimension)) * prior[i]
        dimnames(pclass) <- list(dimnames(newdata)[[1]], dimnames(means)[[1]])
        return(pclass/drop(pclass %*% rep(1, J)))
    }, hierarchical = {
        prior <- 2 * log(prior)
        Pclass <- vector("list", length(dimension.set))
        names(Pclass) <- paste("D", dimension.set, sep = "")
        for (ad in seq(along = dimension.set)) {
            d <- dimension.set[ad]
            dd <- seq(d)
            mindist <- dist(newdata[, dd, drop = FALSE], means[1,
                dd, drop = FALSE], d) - prior[1]
            pclass <- rep(1, nrow(newdata))
            for (i in seq(2, J)) {
                ndist <- dist(newdata[, dd, drop = FALSE], means[i,
                  dd, drop = FALSE], d) - prior[i]
                l <- ndist < mindist
                pclass[l] <- i
                mindist[l] <- ndist[l]
            }
            levels(pclass) <- dimnames(means)[[1]]
            Pclass[[ad]] <- pclass
        }
        rownames <- dimnames(newdata)[[1]]
        if (is.null(rownames)) rownames <- paste(seq(nrow(newdata)))
        return(structure(Pclass, class = "data.frame", row.names = rownames,
            dimensions = dimension.set))
    }, distances = {
        dclass <- matrix(0, nrow(newdata), J)
        for (i in seq(J)) dclass[, i] <- dist(newdata, means[i,
            ], dimension)
        dimnames(dclass) <- list(dimnames(newdata)[[1]], dimnames(means)[[1]])
        return(dclass)
    })
}


Cordialement,
Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 05 Déc 2012, 13:33

Ouch merci Maxime.
Je vais peut être regarder du côté de la logistique alors, pour obtenir mes coefficients !!


Retourner vers « Questions en cours »

Qui est en ligne

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