सामान्यीकृत गैर-कम से कम वर्गों प्रतिगमन (nlme) के लिए "हाथ से" लॉग-लाइक की गणना करें


12

मैं फंक्शन लिए कम से कम वर्ग प्रतिगमन के लिए लॉग- गणना करने का प्रयास कर रहा हूं । आर पैकेज में समारोह , विचरण सहप्रसरण आ वंशावली पेड़ (ब्राउनियन गति संभालने पर दूरी के द्वारा उत्पन्न मैट्रिक्स का उपयोग कर से पैकेज)। निम्नलिखित प्रतिलिपि प्रस्तुत करने योग्य आर कोड x, y डेटा और 9 कर के साथ एक यादृच्छिक पेड़ का उपयोग करके gnls मॉडल को फिट करता है:f(x)=β1(1+xβ2)β3gnlsnlmecorBrownian(phy=tree)ape

require(ape)
require(nlme)
require(expm)
tree <- rtree(9)
x <- c(0,14.51,32.9,44.41,86.18,136.28,178.21,262.3,521.94)
y <- c(100,93.69,82.09,62.24,32.71,48.4,35.98,15.73,9.71)
data <- data.frame(x,y,row.names=tree$tip.label)
model <- y~beta1/((1+(x/beta2))^beta3)
f=function(beta,x) beta[1]/((1+(x/beta[2]))^beta[3])
start <- c(beta1=103.651004,beta2=119.55067,beta3=1.370105)
correlation <- corBrownian(phy=tree)
fit <- gnls(model=model,data=data,start=start,correlation=correlation)
logLik(fit) 

मैं "हाथ से (आर में, लेकिन logLikफ़ंक्शन के उपयोग के बिना ) लॉग-संभावना की गणना करना चाहता हूं, gnlsइसलिए प्राप्त अनुमानित मापदंडों के आधार पर यह आउटपुट से मेल खाता है logLik(fit)। नोट: मैं मापदंडों का अनुमान लगाने की कोशिश नहीं कर रहा हूं; मैं केवल gnlsफ़ंक्शन द्वारा अनुमानित मापदंडों की लॉग-लाइबिलिटी की गणना करना चाहता हूं (हालांकि अगर किसी के पास बिना मापदंडों का अनुमान लगाने का एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है gnls, तो मुझे इसे देखने में बहुत दिलचस्पी होगी!)।

मुझे वास्तव में यकीन नहीं है कि आर में ऐसा करने के बारे में कैसे जाना जाता है। एस और एस-प्लस (पिनहेरो और बेट्स) में मिश्रित-प्रभाव मॉडल में वर्णित रैखिक बीजगणित संकेतन मेरे सिर पर बहुत अधिक है और मेरे किसी भी प्रयास से मेल नहीं खाते हैं logLik(fit)। यहाँ Pinheiro और बेट्स द्वारा वर्णित विवरण हैं:

सामान्यीकृत nonlinear कम से कम वर्ग मॉडल लिए लॉग- जहां की गणना निम्न प्रकार से की जाती है:yi=fi(ϕi,vi)+ϵiϕi=Aiβ

l(β,σ2,δ|y)=12{Nlog(2πσ2)+i=1M[||yifi(β)||2σ2+log|Λi|]}

जहाँ टिप्पणियों का संख्या है, और ।Nfi(β)=fi(ϕi,vi)

Λi धनात्मक-निश्चित है, औरyi=ΛiT/2yifi(ϕi,vi)=ΛiT/2fi(ϕi,vi)

फिक्स्ड और , एमएल का हैβλσ2

σ^(β,λ)=i=1M||yifi(β)||2/N

और प्रोफाइल लॉग-इन संभावना है

l(β,λ|y)=12{N[log(2π/N)+1]+log(i=1M||yifi(β)||2)+i=1Mlog|Λi|}

जिसका उपयोग गॉस-सेडेल एल्गोरिथ्म के साथ एमएल और के एमएल अनुमानों को खोजने के लिए किया जाता है । का एक कम पक्षपाती अनुमान प्रयोग किया जाता है:βλσ2

σ2=i=1M||Λ^iT/2[yifi(β^)]||2/(Np)

जहां की लंबाई को दर्शाता है ।pβ

मैंने उन विशिष्ट प्रश्नों की एक सूची तैयार की है जिनका मैं सामना कर रहा हूँ:

  1. क्या है ? यह दूरी मैट्रिक्स द्वारा निर्मित है में , या यह किसी भी तरह तब्दील हो या parameterized जा करने के लिए द्वारा की जरूरत है , वरना पूरी तरह कुछ?Λibig_lambda <- vcv.phylo(tree)apeλ
  2. क्या होगा , या कम पक्षपाती अनुमान के लिए समीकरण (इस पोस्ट में अंतिम समीकरण)?σ2fit$sigma^2
  3. क्या लॉग- की गणना के लिए का उपयोग करना आवश्यक है , या यह कि पैरामीटर आकलन के लिए सिर्फ एक मध्यवर्ती कदम है? इसके अलावा, उपयोग कैसे किया जाता है? क्या यह एक एकल मूल्य या एक सदिश राशि है, और क्या यह सभी के या सिर्फ ऑफ- तत्वों आदि से गुणा किया जाता है ?λ Λ मैंλλΛi
  4. क्या है? क्या यह पैकेज में होगा ? यदि हां, तो मैं इस बात को लेकर उलझन में हूं कि योग की गणना कैसे करें। , क्योंकि एक एकल मान लौटाता है, कोई नहीं वेक्टर।एम Σ मैं = 1 | | y * मैं - * मैं ( β ) | | 2||yf(β)||norm(y-f(fit$coefficients,x),"F")Matrixi=1M||yifi(β)||2norm()
  5. एक व्यक्ति गणना कैसे करता है? क्या यह वह जगह है जहां , या यह पैकेज से है ? यदि यह है , तो कोई मैट्रिक्स का योग कैसे लेता है (या क्या यह निहित है कि यह सिर्फ विकर्ण तत्व है)?log|Λi|log(diag(abs(big_lambda)))big_lambdaΛilogm(abs(big_lambda))expmlogm()
  6. बस इस बात की पुष्टि करने के लिए कि क्या इस तरह से गणना की गई है: ?ΛiT/2t(solve(sqrtm(big_lambda)))
  7. कैसे हैं और की गणना? क्या यह निम्नलिखित में से एक है:yifi(β)

y_star <- t(solve(sqrtm(big_lambda))) %*% y

तथा

f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)

या यह होगा

y_star <- t(solve(sqrtm(big_lambda))) * y

तथा

f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x) ?

यदि इन सभी प्रश्नों का उत्तर दिया जाता है, तो सिद्धांत रूप में, मुझे लगता है कि आउटपुट से मिलान करने के लिए लॉग-लाइबिलिटी की गणना की जानी चाहिए logLik(fit)। इनमें से किसी भी प्रश्न पर किसी भी मदद की बहुत सराहना की जाएगी। अगर कुछ भी स्पष्टीकरण की आवश्यकता है, तो कृपया मुझे बताएं। धन्यवाद!

अद्यतन : मैं लॉग-संभावना की गणना के लिए विभिन्न संभावनाओं के साथ प्रयोग कर रहा हूं, और यहां अब तक का सबसे अच्छा मैं आया हूं। logLik_calcद्वारा लौटाए गए मूल्य से लगभग 1 से 3 गुना अधिक है logLik(fit)। या तो मैं वास्तविक समाधान के करीब हूं, या यह पूरी तरह से संयोग से है। कोई विचार?

  C <- vcv.phylo(tree) # variance-covariance matrix
  tC <- t(solve(sqrtm(C))) # C^(-T/2)
  log_C <- log(diag(abs(C))) # log|C|
  N <- length(y)
  y_star <- tC%*%y 
  f_star <- tC%*%f(fit$coefficients,x)
  dif <- y_star-f_star  
  sigma_squared <-  sum(abs(y_star-f_star)^2)/N
  # using fit$sigma^2 also produces a slightly different answer than logLik(fit)
  logLik_calc <- -((N*log(2*pi*(sigma_squared)))+
       sum(((abs(dif)^2)/(sigma_squared))+log_C))/2

फ़ंक्शन की आपकी परिभाषा दाहिने हाथ की ओर गायब है । f(x)x
Glen_b -Reinstate मोनिका

जवाबों:


10

आइए सरल मामले से शुरू करते हैं जहां अवशेषों के लिए कोई सहसंबंध संरचना नहीं है:

fit <- gnls(model=model,data=data,start=start)
logLik(fit)

लॉग संभावना की गणना आसानी से हाथ से की जा सकती है:

N <- fit$dims$N
p <- fit$dims$p
sigma <- fit$sigma * sqrt((N-p)/N)
sum(dnorm(y, mean=fitted(fit), sd=sigma, log=TRUE))

चूंकि अवशिष्ट स्वतंत्र हैं, हम केवल dnorm(..., log=TRUE)व्यक्तिगत लॉग संभावना शर्तों को प्राप्त करने के लिए उपयोग कर सकते हैं (और फिर उन्हें योग करें)। वैकल्पिक रूप से, हम उपयोग कर सकते हैं:

sum(dnorm(resid(fit), mean=0, sd=sigma, log=TRUE))

ध्यान दें कि fit$sigma" " का कम बायस्ड अनुमान नहीं है - इसलिए हमें पहले मैन्युअल रूप से सुधार करने की आवश्यकता है।σ2

अब और अधिक जटिल मामले के लिए जहां अवशेषों को सहसंबद्ध किया जाता है:

fit <- gnls(model=model,data=data,start=start,correlation=correlation)
logLik(fit)

यहां, हमें बहुभिन्नरूपी सामान्य वितरण का उपयोग करने की आवश्यकता है। मुझे यकीन है कि इसके लिए कहीं न कहीं एक समारोह है, लेकिन चलो बस इसे हाथ से करें:

N <- fit$dims$N
p <- fit$dims$p
yhat <- cbind(fitted(fit))
R <- vcv(tree, cor=TRUE)
sigma <- fit$sigma * sqrt((N-p)/N)
S <- diag(sigma, nrow=nrow(R)) %*% R %*% diag(sigma, nrow=nrow(R))
-1/2 * log(det(S)) - 1/2 * t(y - yhat) %*% solve(S) %*% (y - yhat) - N/2 * log(2*pi)

असंबद्ध अवशिष्टों के लिए लॉग-लाइबिलिटी ने पूरी तरह से काम किया, हालांकि मैं बहुभिन्नरूपी सामान्य वितरण का पता नहीं लगा सकता। इस मामले में, एस क्या है? मैंने S <- vcv.phylo (ट्री) आज़माया और लॉग-लाइक के लिए लगभग -700 प्राप्त किया, जबकि logLik (फिट) लगभग -33 था।
एरिक

क्षमा करें - जब मैंने कोड को कॉपी-पेस्ट किया तो मैंने गड़बड़ कर दी। अब यह पूरा हो गया है। S अवशिष्टों का प्रसरण-सहसंयोजक मैट्रिक्स है। आप सही ट्रैक पर थे ( vcvफ़ंक्शन के साथ ) - लेकिन आपको सहसंबंध मैट्रिक्स प्राप्त करने की आवश्यकता है और फिर इसे var-cov मैट्रिक्स में बदलने के लिए का उपयोग करें। σ^2
वोल्फगैंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.