2013-07-24 4 views
1

Je rencontre des problèmes lors de l'utilisation de la fonction polr.polr (..) régression logistique ordinale dans R

Voici un sous-ensemble des données dont je dispose:

# response variable 
rep = factor(c(0.00, 0.04, 0.06, 0.13, 0.15, 0.05, 0.07, 0.00, 0.06, 0.04, 0.05, 0.00, 0.92, 0.95, 0.95, 1, 0.97, 0.06, 0.06, 0.03, 0.03, 0.08, 0.07, 0.04, 0.08, 0.03, 0.07, 0.05, 0.05, 0.06, 0.04, 0.04, 0.08, 0.04, 0.04, 0.04, 0.97, 0.03, 0.04, 0.02, 0.04, 0.01, 0.06, 0.06, 0.07, 0.08, 0.05, 0.03, 0.06,0.03)) 
# "rep" is discrete variable which represents proportion so that it varies between 0 and 1 
# It is discrete proportions because it is the proportion of TRUE over a finite list of TRUE/FALSE. example: if the list has 3 arguments, the proportions value can only be 0,1/3,2/3 or 1 

# predicted variable 
set.seed(10) 
pred.1 = sample(x=rep(1:5,10),size=50) 
pred.2 = sample(x=rep(c('a','b','c','d','e'),10),size=50) 
# "pred" are discrete variables 

# polr 
polr(rep~pred.1+pred.2) 

Le sous-ensemble, je vous ai donné fonctionne très bien! Mais tout mon ensemble de données et certains sous-ensembles ne fonctionnent pas! Et je ne trouve rien dans mes données qui diffère de ce sous-ensemble, sauf la quantité. Donc, voici ma question: Y at-il des limites en termes de nombre de niveaux par exemple qui produiraient au message d'erreur suivant:

Error in optim(s0, fmin, gmin, method = "BFGS", ...) : 
    the initial value in 'vmin' is not finite 

et le message de notification:

glm.fit: fitted probabilities numerically 0 or 1 occurred 

(I J'ai dû traduire ces deux messages en anglais afin qu'ils ne soient pas 100% corrects)

Je reçois parfois seulement le message de notification et parfois tout va bien selon le sous-ensemble de mes données que j'utilise.

Ma variable représentant un total de 101 niveaux d'information (et contiennent rien d'autre que le type de données que j'ai décrit)

Il est donc une terrible question que je pose becaue je ne peux pas vous donner mon jeu de données complet et je ne sais pas où est le problème. Pouvez-vous deviner d'où vient mon problème grâce à ces informations?

Merci

+0

101 niveaux est probablement votre problème. Vous n'allez pas tirer beaucoup d'avantages de l'ajustement d'un modèle avec un facteur comme celui-là. Vous devez repenser la façon dont vous organisez vos données. – joran

+0

L'avertissement de 'glm.fit' est expliqué [ici] (http://stackoverflow.com/q/8596160/324364), ce qui explique probablement pourquoi l'optimisation échoue. – joran

Répondre

0

Suivant les conseils de @ Joran que votre problème est probablement le facteur niveau 100, je vais recommander quelque chose qui est probablement pas statistiquement valide, mais sera probablement encore efficace dans votre particulier situation: n'utilisez pas du tout la régression logistique. Laisse tomber. Effectuez une régression linéaire simple, puis discrétisez votre sortie si nécessaire en utilisant une procédure d'arrondissement spécialisée. Essayez-le et voyez comment cela fonctionne pour vous.

rep.v = c(0.00, 0.04, 0.06, 0.13, 0.15, 0.05, 0.07, 0.00, 0.06, 0.04, 0.05, 0.00, 0.92, 0.95, 0.95, 1, 0.97, 0.06, 0.06, 0.03, 0.03, 0.08, 0.07, 0.04, 0.08, 0.03, 0.07, 0.05, 0.05, 0.06, 0.04, 0.04, 0.08, 0.04, 0.04, 0.04, 0.97, 0.03, 0.04, 0.02, 0.04, 0.01, 0.06, 0.06, 0.07, 0.08, 0.05, 0.03, 0.06,0.03) 

set.seed(10) 
pred.1 = factor(sample(x=rep(1:5,10),size=50)) 
pred.2 = factor(sample(x=rep(c('a','b','c','d','e'),10),size=50)) 

model = lm(rep.v~as.factor(pred.1) + as.factor(pred.2)) 
output = predict(model, newx=data.frame(pred.1, pred.2)) 

# Here's one way you could accomplish the discretization/rounding 
f.levels = unique(rep.v) 
rounded = sapply(output, function(x){ 
    d = abs(f.levels-x) 
    f.levels[d==min(d)] 
    } 
) 

>rounded 

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
0.06 0.07 0.00 0.06 0.15 0.00 0.07 0.00 0.13 0.06 0.06 0.15 0.15 0.92 0.15 0.92 0.15 0.15 0.06 0.06 0.00 0.07 0.15 0.15 
    25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 
0.15 0.15 0.00 0.00 0.15 0.00 0.15 0.15 0.07 0.15 0.00 0.07 0.15 0.00 0.15 0.15 0.00 0.15 0.15 0.15 0.92 0.15 0.15 0.00 
    49 50 
0.13 0.15 
0

orm de rms peut gérer les résultats commandés avec un grand nombre de catégories.

library(rms) 
orm(rep ~ pred.1 + pred.2) 
Questions connexes