2012-05-15 12 views
7

मैं पैकेज में mle2 कमांड का उपयोग करने का प्रयास कर रहा हूं। मैं बोकर द्वारा bbmle पैकेज के साथ अधिकतम संभावना अनुमान और विश्लेषण के पी 2 देख रहा हूं। किसी भी तरह से मैं सही शुरू मूल्यों में प्रवेश करने में विफल रहता हूं। यहाँ प्रतिलिपि प्रस्तुत करने योग्य कोड है:आर में प्रोफाइल आत्मविश्वास अंतराल: mle2

l.lik.probit <-function(par, ivs, dv){ 
Y <- as.matrix(dv) 
X <- as.matrix(ivs) 
K <-ncol(X) 
b <- as.matrix(par[1:K]) 
phi <- pnorm(X %*% b) 
sum(Y * log(phi) + (1 - Y) * log(1 - phi)) 
} 

n=200 

set.seed(1000) 

x1 <- rnorm(n) 
x2 <- rnorm(n) 
x3 <- rnorm(n) 
x4 <- rnorm(n) 

latentz<- 1 + 2.0 * x1 + 3.0 * x2 + 5.0 * x3 + 8.0 * x4 + rnorm(n,0,5) 

y <- latentz 
y[latentz < 1] <- 0 
y[latentz >=1] <- 1 
x <- cbind(1,x1,x2,x3,x4) 
values.start <-c(1,1,1,1,1) 

foo2<-mle2(l.lik.probit, start=list(dv=0,ivs=values.start),method="BFGS",optimizer="optim", data=list(Y=y,X=x)) 

और इस त्रुटि मैं है:

Error in mle2(l.lik.probit, start = list(Y = 0, X = values.start), method = "BFGS", : 
    some named arguments in 'start' are not arguments to the specified log-likelihood function 

किसी भी विचार क्यों? आपकी सहायताके लिए धन्यवाद!

+1

'values.start' निर्दिष्ट नहीं है। आपको इसे परिभाषित करना होगा। 'Foo2 << -' में एक टाइपो भी है। –

+0

त्वरित उत्तर के लिए धन्यवाद! मैंने उन परिवर्तन किए हैं (मेरे शुरुआती मान मान हैं। प्रारंभ <-c (1,1,1,1,1)), लेकिन मुझे अभी भी एक ही त्रुटि संदेश मिलता है। मेरा मानना ​​है कि mle2 कमांड और मेरे द्वारा निर्दिष्ट फ़ंक्शन के बीच कुछ असंगतता है, लेकिन मैं इसे मेरे जीवन के लिए नहीं समझ सकता! – EOM

+1

क्या आप एक [प्रोबिट रिग्रेशन] (http://www.ats.ucla.edu/stat/R/dae/probit.htm) लागू कर रहे हैं? –

उत्तर

6

आपने कुछ चीजें याद कर दी हैं, लेकिन सबसे महत्वपूर्ण यह है कि डिफ़ॉल्ट रूप से mle2सूची पैरामीटर की सूची लेता है; आप इसके बजाय वेक्टर पैरामीटर ले सकते हैं, लेकिन आपको थोड़ा कठिन काम करना होगा।

मैंने कोड में कोड को थोड़ा tweaked किया है। (मैं एक नकारात्मक लॉग-संभावना समारोह है, जो बिना यह काम कभी नहीं होगा करने के लिए लॉग-संभावना समारोह बदल गया है!)

l.lik.probit <-function(par, ivs, dv){ 
    K <- ncol(ivs) 
    b <- as.matrix(par[1:K]) 
    phi <- pnorm(ivs %*% b) 
    -sum(dv * log(phi) + (1 - dv) * log(1 - phi)) 
} 

n <- 200 

set.seed(1000) 

dat <- data.frame(x1=rnorm(n), 
        x2=rnorm(n), 
        x3=rnorm(n), 
        x4=rnorm(n)) 

beta <- c(1,2,3,5,8) 
mm <- model.matrix(~x1+x2+x3+x4,data=dat) 
latentz<- rnorm(n,mean=mm%*%beta,sd=5) 

y <- latentz 
y[latentz < 1] <- 0 
y[latentz >=1] <- 1 
x <- mm 
values.start <- rep(1,5) 

अब हम फिट है। मुख्य बात vecpar=TRUE निर्दिष्ट करने के लिए और parnames उपयोग करने के लिए mle2 पैरामीटर वेक्टर में तत्वों के नाम बताने के लिए ...

library("bbmle") 
names(values.start) <- parnames(l.lik.probit) <- paste0("b",0:4) 
m1 <- mle2(l.lik.probit, start=values.start, 
      vecpar=TRUE, 
      method="BFGS",optimizer="optim", 
      data=list(dv=y,ivs=x)) 

जैसा कि ऊपर इस विशिष्ट उदाहरण के लिए आप सिर्फ PROBIT फिर से लागू कर दिया है ने कहा है प्रतिगमन (हालांकि मैं समझता हूँ कि आप अब इस विस्तार करने के लिए किसी तरह से heteroscedasticity के लिए अनुमति देना चाहते हैं ...)

dat2 <- data.frame(dat,y) 
m2 <- glm(y~x1+x2+x3+x4,family=binomial(link="probit"), 
    data=dat2) 

एक अंतिम टिप्पणी के रूप में, मुझे लगता है कि आप parameters तर्क की जांच करनी चाहिए, जो आप की अनुमति देता है कहेंगे किसी भी पैरामीटर के लिए उप-रैखिक मॉडल निर्दिष्ट करने के लिए, और formula इंटरफ़ेस:

m3 <- mle2(y~dbinom(prob=pnorm(eta),size=1), 
      parameters=list(eta~x1+x2+x3+x4), 
      start=list(eta=0), 
      data=dat2) 

पुनश्च confint(foo2) इस व्यवस्था के साथ (अनुरोध किया प्रोफ़ाइल सीआईएस दे रही है) ठीक से काम करने के लिए प्रकट होता है।

ae <- function(x,y) all.equal(unname(coef(x)),unname(coef(y)),tol=5e-5) 
ae(m1,m2) && ae(m2,m3) 
संबंधित मुद्दे

 संबंधित मुद्दे