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

ทำนาย: multinom ()

งั้นลองทำนาย X1 ด้วย X2 โดยใช้ multinom () จากแพ็คเกจ nnet:

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 ดังนั้นจึงไม่มีการทำให้เป็นมาตรฐานและพารามิเตอร์ควรมีข้อมูลเดียวกับพารามิเตอร์ของฟังก์ชัน multinom ()

แต่ถึงกระนั้นเราได้รับพารามิเตอร์ที่แตกต่างกันมาก นี่เป็นเพราะพารามิเตอร์ที่แตกต่างที่พวกเขาใช้ใน glmnet ดูเช่น:

http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (หัวเรื่อง: โมเดล Multinomial) หรือบทความที่เกี่ยวข้อง: http://www.jstatsoft.org/v33/i01/paper (หัวเรื่อง: 4. กำหนดมาตรฐาน ถดถอยพหุนาม)

แต่ไม่ว่าพารามิเตอร์จะมีค่าเพียงใด แต่ควรได้รับเดียวกันความน่าจะเป็นของหมวด k ตามเงื่อนไขบน XP(Y=k|X)

ความน่าจะเป็นที่มีเงื่อนไข: multinom ()

ดังนั้นก่อนอื่นฉันคำนวณความน่าจะเป็นเหล่านี้จาก multinom ():

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

ความน่าจะเป็นตามเงื่อนไขของเซลล์ค่อนข้างจะสัมพันธ์กัน แต่แตกต่างกัน นอกจากนี้พวกเขาจะไม่รวมถึงหนึ่ง

ดังนั้นเราจึงมีสองปัญหาที่นี่:

ก) ความน่าจะเป็นแบบมีเงื่อนไขไม่รวมกันไม่เกิน 1 และ

b) พารามิเตอร์ไม่ได้อธิบายสิ่งที่เราเห็นในข้อมูล: เช่นในแถวที่ 2 มีความแตกต่างระหว่างคอลัมน์ แต่ glmnet ประมาณการค่าสัมประสิทธิ์ทั้งสอง (ไม่ใช่ค่าตัด) เป็นศูนย์

ฉันใช้ปัญหาการถดถอยเชิงเส้นและเปรียบเทียบ glm และ glmnet กับ s = 0 เพื่อให้แน่ใจว่า s = 0 หมายถึงการทำให้เป็นศูนย์อย่างสม่ำเสมอ (การแก้ปัญหาเกือบเหมือนกัน)

ความช่วยเหลือและความคิดใด ๆ จะได้รับการชื่นชมอย่างมาก!

คำตอบ:


5

เกี่ยวกับพารามิเตอร์จาก multinom และ glmnet ฉันพบว่าคำตอบนี้เป็นประโยชน์ ฉันสามารถใช้อัลกอริธึม glm เพื่อทำการถดถอยโลจิสติกแบบหลายส่วนได้หรือไม่?

โดยเฉพาะอย่างยิ่ง "ใช่ด้วย Poisson GLM (โมเดลเชิงเส้นบันทึก) คุณสามารถใส่โมเดลพหุนามได้ดังนั้นโมเดลโลจิสติกพหุนามหรือบันทึกเชิงเส้นปัวซองรุ่นเทียบเท่า

ดังนั้นฉันจะแสดง reparametrization ของค่าสัมประสิทธิ์ glmnet กับค่าสัมประสิทธิ์ multinom

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 - ทำไม glment จึงสร้างค่าสัมประสิทธิ์ซึ่งเป็นการรวมกันของค่าสัมประสิทธิ์พหุนามแบบทั่วไปและค่าสัมประสิทธิ์ 'ฐาน' สิ่งนี้ช่วยให้เราสามารถตีความค่าสัมประสิทธิ์แต่ละชุดเป็นโมเดลเชิงเส้นล็อกหรือไม่?
samplesize1 1

0

เพื่อให้แน่ใจว่าผลรวมของความน่าจะเป็นทางเลือกคือ 1 พารามิเตอร์ทั้งหมดของทางเลือกการอ้างอิงจะต้องเป็นศูนย์ ดังนั้นฉันคิดว่าผลลัพธ์ของ glmnet () แปลก

ที่เกี่ยวข้อง Q: ทำไม glmnet สามารถคำนวณพารามิเตอร์สำหรับทุกหมวดหมู่ได้?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.