मैं फंक्शन लिए कम से कम वर्ग प्रतिगमन के लिए लॉग- गणना करने का प्रयास कर रहा हूं । आर पैकेज में समारोह , विचरण सहप्रसरण आ वंशावली पेड़ (ब्राउनियन गति संभालने पर दूरी के द्वारा उत्पन्न मैट्रिक्स का उपयोग कर से पैकेज)। निम्नलिखित प्रतिलिपि प्रस्तुत करने योग्य आर कोड x, y डेटा और 9 कर के साथ एक यादृच्छिक पेड़ का उपयोग करके gnls मॉडल को फिट करता है:gnls
nlme
corBrownian(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 कम से कम वर्ग मॉडल लिए लॉग- जहां की गणना निम्न प्रकार से की जाती है:
जहाँ टिप्पणियों का संख्या है, और ।
धनात्मक-निश्चित है, और
फिक्स्ड और , एमएल का है
और प्रोफाइल लॉग-इन संभावना है
जिसका उपयोग गॉस-सेडेल एल्गोरिथ्म के साथ एमएल और के एमएल अनुमानों को खोजने के लिए किया जाता है । का एक कम पक्षपाती अनुमान प्रयोग किया जाता है:
जहां की लंबाई को दर्शाता है ।
मैंने उन विशिष्ट प्रश्नों की एक सूची तैयार की है जिनका मैं सामना कर रहा हूँ:
- क्या है ? यह दूरी मैट्रिक्स द्वारा निर्मित है में , या यह किसी भी तरह तब्दील हो या parameterized जा करने के लिए द्वारा की जरूरत है , वरना पूरी तरह कुछ?
big_lambda <- vcv.phylo(tree)
ape
- क्या होगा , या कम पक्षपाती अनुमान के लिए समीकरण (इस पोस्ट में अंतिम समीकरण)?
fit$sigma^2
- क्या लॉग- की गणना के लिए का उपयोग करना आवश्यक है , या यह कि पैरामीटर आकलन के लिए सिर्फ एक मध्यवर्ती कदम है? इसके अलावा, उपयोग कैसे किया जाता है? क्या यह एक एकल मूल्य या एक सदिश राशि है, और क्या यह सभी के या सिर्फ ऑफ- तत्वों आदि से गुणा किया जाता है ?λ Λ मैं
- क्या है? क्या यह पैकेज में होगा ? यदि हां, तो मैं इस बात को लेकर उलझन में हूं कि योग की गणना कैसे करें। , क्योंकि एक एकल मान लौटाता है, कोई नहीं वेक्टर।एम Σ मैं = 1 | | y * मैं - च * मैं ( β ) | | 2
norm(y-f(fit$coefficients,x),"F")
Matrix
norm()
- एक व्यक्ति गणना कैसे करता है? क्या यह वह जगह है जहां , या यह पैकेज से है ? यदि यह है , तो कोई मैट्रिक्स का योग कैसे लेता है (या क्या यह निहित है कि यह सिर्फ विकर्ण तत्व है)?
log(diag(abs(big_lambda)))
big_lambda
logm(abs(big_lambda))
expm
logm()
- बस इस बात की पुष्टि करने के लिए कि क्या इस तरह से गणना की गई है: ?
t(solve(sqrtm(big_lambda)))
- कैसे हैं और की गणना? क्या यह निम्नलिखित में से एक है:
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