glmnet: बहुराष्ट्रीय मानकीकरण की समझ कैसे बनाएं?


11

निम्नलिखित समस्या: मैं glmnet () का उपयोग करके एक (या अधिक) श्रेणीगत चर के साथ एक श्रेणीगत प्रतिक्रिया चर की भविष्यवाणी करना चाहता हूं।

हालाँकि, मैं आउटपुट glmnet की समझ में नहीं आता मुझे देता है।

ठीक है, पहले दो संबंधित श्रेणीगत चर उत्पन्न करते हैं:

डेटा जनरेट करें

p <- 2 #number variables
mu <- rep(0,p)
sigma <- matrix(rep(0,p^2), ncol=p)
sigma[1,2] <- .8 #some relationship ..
diag(sigma) <- 1
sigma <- pmax(sigma, t(sigma))
n <- 100
set.seed(1)
library(MASS)
dat <- mvrnorm(n, mu, sigma)
#discretize
k <- 3 # number of categories
d <- apply(dat, 2, function(x) {
  q <- quantile(x, probs=seq(0,1, 1/k))[-c(1, k+1)]
  out <- numeric(length(x))
  for(i in 1:(k-1))
  {  out[x<q[k-i]] <- i } 
  return(out)
})
d <- data.frame(apply(d, 2, as.factor))
d[,2] <- relevel(d[,2], ref="0")
d[,1] <- relevel(d[,1], ref="0")
colnames(d) <- c("X1", "X2")

हमें मिला:

> table(d)
   X2
X1   0  1  2
  0 22 11  1
  1  9 14 10
  2  3  8 22

भविष्यवाणी: बहुराष्ट्रीय ()

फिर एनएक्स पैकेज से मल्टीनॉम () का उपयोग करके एक्स 2 द्वारा एक्स 1 की भविष्यवाणी करें:

library(nnet)
mod1 <- multinom(X1~X2, data=d)
mod1

जो हमें देता है:

Call:
multinom(formula = X1 ~ X2, data = d)

Coefficients:
  (Intercept)      X21      X22
1  -0.8938246 1.134993 3.196476
2  -1.9924124 1.673949 5.083518

मैनुअल जांच

अब देखते हैं कि क्या हम मैन्युअल रूप से पुन: पेश कर सकते हैं:

tb <- table(d)
log(tb[2,1] / tb[1,1]) #intercept category1
[1] -0.8938179
log(tb[3,1] / tb[1,1]) #intercept category2
[1] -1.99243
log((tb[1,1]*tb[2,2]) / (tb[1,2]*tb[2,1])) #logodds-ratio cat X1 0vs1 in X2 0vs1
[1] 1.13498
#same for the three remaining log odds ratios

हम एक ही नंबर का उत्पादन करते हैं, अच्छा!

भविष्यवाणी: glmnet ()

अब glmnet के साथ भी ऐसा ही करते हैं:

library(glmnet)
y <- d[,1]
X <- model.matrix(X1~X2, data=d)[,-1]
mod2 <- glmnet(X, y, family="multinomial", lambda=c(0))
coef(mod2, s=0) #meaning of coefficients unclear!
$`0`
3 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept)  0.9620216
X21         -1.1349130
X22         -3.1958293   

$`1`
3 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept) 0.06825755
X21         .         
X22         .         

$`2`
3 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept) -1.0302792
X21          0.5388814
X22          1.8870363

ध्यान दें कि मैंने s = 0 सेट किया है, इस प्रकार कोई नियमितीकरण नहीं है और पैरामीटर में बहुपद () फ़ंक्शन के मापदंडों के समान सटीक जानकारी होनी चाहिए।

फिर भी, हमें बहुत अलग पैरामीटर मिलते हैं। यह अलग-अलग पैरामीटर के कारण होता है जिसका उपयोग वे glmnet में करते हैं, उदाहरण के लिए देखें:

http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (शीर्षक: बहुराष्ट्रीय मॉडल) या संबंधित पेपर: http://www.jstatsoft.org/v33/i01/paper (शीर्षक: 4. नियमित बहुराष्ट्रीय प्रतिगमन)

P(Y=k|X)

सशर्त संभावनाएं: बहुराष्ट्रीय ()

इसलिए मैं सबसे पहले मैं मल्टीइनॉम () से इन संभावनाओं की गणना करता हूं:

p.fit <- predict(mod1, type="probs")
head(d)
head(p.fit)
ccp <- matrix(0,3,3)
ccp[,3] <- p.fit[1,]
ccp[,2] <- p.fit[2,]
ccp[,1] <- p.fit[4,]
ccp
           [,1]      [,2]       [,3]
[1,] 0.64705896 0.3333332 0.03030114
[2,] 0.26470416 0.4242450 0.30303140
[3,] 0.08823688 0.2424218 0.66666746
colSums(ccp) #sum to 1, ok; sorry for the awful code ...
[1] 1 1 1

जैसा कि हमारे यहाँ एक संतृप्त मॉडल है, यह वही होना चाहिए जो हम डेटा से गणना कर सकते हैं:

emp <- table(d)/100
cemp <- apply(emp, 2, function(x) {
  x / sum(x)
})
cemp 
   X2
             0         1          2
  0 0.64705882 0.3333333 0.03030303
  1 0.26470588 0.4242424 0.30303030
  2 0.08823529 0.2424242 0.66666667

जो वास्तव में मामला है।

सशर्त संभावनाएं: glmnet ()

अब glmnet से समान:

c1 <- coef(mod2, s=0)
c <-matrix(rapply(c1, function(x) { as.matrix(x)}, how="unlist"), 3,3, byrow=T)

ccp2 <- matrix(0,3,3)
config <- rbind(c(0,0), c(1,0), c(0,1))

for(l in 1:3) #loop through categories
{
  denom <- numeric(3)
  for(i in 1:3) # loop through possible predictor combinations
  { 
    x1 <- config[i, 1]
    x2 <- config[i, 2]
    denom[i] <- exp(c[l,1] + x1 * c[l,2]  + x2 * c[l,3])
  }
  ccp2[l,1] <- denom[1] / sum(denom)
  ccp2[l,2] <- denom[2] / sum(denom)
  ccp2[l,3] <- denom[3] / sum(denom)
}
ccp2
          [,1]      [,2]       [,3]
[1,] 0.7340082 0.2359470 0.03004484
[2,] 0.3333333 0.3333333 0.33333333
[3,] 0.1073668 0.1840361 0.70859708
colSums(ccp2)
[1] 1.1747083 0.7533165 1.0719753

सेल सशर्त संभावनाएं कुछ हद तक संबंधित हैं लेकिन अलग हैं। इसके अलावा वे एक के लिए योग नहीं करते हैं।

तो हमारे यहाँ दो समस्याएं हैं:

a) सशर्त संभाव्यताएं 1 और 1 के योग नहीं हैं

बी) मापदंडों का वर्णन नहीं है कि हम डेटा में क्या देखते हैं: उदाहरण के लिए पंक्ति 2 में स्तंभों में अंतर हैं, लेकिन ग्लमेनेट दोनों गुणांक (अंतराल नहीं) के रूप में अनुमान लगाता है।

मैंने एक रेखीय प्रतिगमन समस्या का उपयोग किया और यह सुनिश्चित करने के लिए s = 0 के साथ glm और glmnet की तुलना की कि यह सुनिश्चित करने के लिए कि s = 0 का अर्थ है शून्य नियमितीकरण (समाधान लगभग समान थे)।

किसी भी मदद और विचारों को बहुत सराहना की जाएगी!

जवाबों:


5

मल्टीमॉम और ग्लमैनेट के मापदंडों के बारे में, मुझे यह उत्तर फायदेमंद लगा, क्या मैं मल्टीमोमियल लॉजिस्टिक रिग्रेशन करने के लिए ग्लम एल्गोरिदम का उपयोग कर सकता हूं?

विशेष रूप से, "हां, एक पॉइसन जीएलएम (लॉग रैखिक मॉडल) के साथ आप बहुराष्ट्रीय मॉडल फिट कर सकते हैं। इसलिए बहुराष्ट्रीय लॉजिस्टिक या लॉग रैखिक पॉइसन मॉडल समकक्ष हैं।"

तो मैं मल्टीनेट गुणांक के glmnet गुणांक के पुनर्संरचना को दिखाऊंगा।

n.subj=1000
x1 <- rnorm(n.subj)
x2 <- rnorm(n.subj)
prob <- matrix(c(rep(1,n.subj), exp(3+2*x1+x2), exp(-1+x1-3*x2)), , ncol=3)
prob <- sweep(prob, 1, apply(prob, 1, sum), "/")

y = c()
for (i in 1:n.subj)
  y[i] <- sample(3, 1, replace = T, prob = prob[i,])

multinom(y~x1+x2)

x <- cbind(x1,x2); y2 <- factor(y)
fit <- glmnet(x, y2, family="multinomial", lambda=0, type.multinomial =     "grouped")
cf <- coef(fit)

cf[[2]]@x - cf[[1]]@x   # for the category 2
cf[[3]]@x - cf[[1]]@x   # for the category 3

उम्मीद है की यह मदद करेगा। लेकिन मुझे नहीं लगता कि मैं सामान्यीकृत रैखिक मॉडल (पॉइसन) और बहुराष्ट्रीय लॉजिस्टिक मॉडल की समानता को समझता हूं।

मुझे बताओ अगर वहाँ अच्छा और पठनीय है और "आसानी से" समझने योग्य स्रोत है ..


1
क्या आपके पास "क्यों" यह मामला है? Ie - क्यों ग्लिम गुणांक पैदा करता है जो अधिक विशिष्ट बहुराष्ट्रीय गुणांक और 'आधार' गुणांक का एक संयोजन है। क्या यह हमें गुणांक के प्रत्येक सेट को लॉग-लीनियर मॉडल के रूप में व्याख्या करने की अनुमति देता है ?
नमूने

0

यह सुनिश्चित करने के लिए कि पसंद की संभावनाओं का योग 1 है, संदर्भ विकल्प के सभी मापदंडों को शून्य होना आवश्यक है। इसलिए, मुझे लगता है कि glmnet () का परिणाम विषम है।

संबंधित क्यू: क्यों glmnet सभी श्रेणी के लिए गणना की जा सकती मापदंडों?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.