簡體   English   中英

如何在R中找到二階導數以及如何使用牛頓法和數值導數

[英]How to find the second derivative in R and while using newton's method with numerical derivation

標度參數為1的伽馬分布的對數似然可寫為:

(α−1)s−nlogΓ(α)其中,α是形狀參數,而s=∑logXi是足夠的統計量。

隨機繪制形狀參數為alpha = 4.5的n = 30的樣本。 使用newton_searchmake_derivative ,找到alpha的最大似然估計。 使用alpha的矩估計量,即x的平均值作為初始猜測。 R中的對數似然函數為:

x <- rgamma(n=30, shape=4.5)
gllik <- function() {
  s <- sum(log(x))
  n <- length(x)
  function(a) {
    (a - 1) * s - n * lgamma(a)
    }
}

我創建了make_derivative函數,如下所示:

make_derivative <- function(f, h) {
  (f(x + h) - f(x - h)) / (2*h)
}

我還創建了一個newton_search結合了功能make_derivative功能; 但是,我需要在對數似然函數的二階導數上使用newton_search ,但我不確定如何修復以下代碼才能做到這一點:

newton_search2 <- function(f, h, guess, conv=0.001) {
    set.seed(2)  
    y0 <- guess
    N = 1000
    i <- 1; y1 <- y0
    p <- numeric(N)
  while (i <= N) {
    make_derivative <- function(f, h) {
  (f(y0 + h) - f(y0 - h)) / (2*h)
    }
    y1 <- (y0 - (f(y0)/make_derivative(f, h)))
    p[i] <- y1
    i <- i + 1
    if (abs(y1 - y0) < conv) break
    y0 <- y1
  }
  return (p[(i-1)])
}

提示:您必須將newton_search應用於對數似然的一階和二階導數(使用make_derivative通過數字make_derivative )。 您的答案應該在4.5附近。

當我運行newton_search2(gllik(), 0.0001, mean(x), conv = 0.001) ,得到的答案應該是newton_search2(gllik(), 0.0001, mean(x), conv = 0.001)兩倍。

我重新編寫了代碼,現在它可以完美運行(甚至比我最初寫的還要好)。 感謝所有的幫助。 :-)

newton_search <- function(f, df, guess, conv=0.001) {
    set.seed(1)
    y0 <- guess
    N = 100
    i <- 1; y1 <- y0
    p <- numeric(N)
  while (i <= N) {
    y1 <- (y0 - (f(y0)/df(y0)))
    p[i] <- y1
    i <- i + 1
    if (abs(y1 - y0) < conv) break
    y0 <- y1
  }
  return (p[(i-1)])
}

make_derivative <- function(f, h) {
  function(x){(f(x + h) - f(x - h)) / (2*h)
  }
}

df1 <- make_derivative(gllik(), 0.0001)
df2 <- make_derivative(df1, 0.0001)
newton_search(df1, df2, mean(x), conv = 0.001)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM