如何在R中正确对似然函数关于beta和theta求符号导数?
解决方法
针对β的符号求导
你的代码未指定β为向量类型,Deriv默认按标量处理,导致求导结果错误。需添加vec=TRUE参数,并明确X、y、V为与β无关的常量。
正确代码:
library(Deriv) # 定义常量占位,告知Deriv这些变量不随β变化 X <- expression() y <- expression() V <- expression() LogL <- expression( -0.5 * (log(det(V)) + t(y - X %*% beta) %*% solve(V) %*% (y - X %*% beta)) ) # 一阶导数(梯度向量) dLogL_dbeta <- Deriv(LogL, "beta", vec = TRUE) # 二阶导数(Hessian矩阵) d2LogL_dbeta2 <- Deriv(dLogL_dbeta, "beta", vec = TRUE)
针对θ的符号求导
你的矩阵构造语法存在歧义,且未明确θ为向量。建议直接将V的表达式嵌入对数似然函数,同时指定vec=TRUE。若需保留符号化的n,推荐使用Ryacas包(对符号矩阵支持更完善)。
方法1:使用Deriv包(n为具体数值)
library(Deriv) # 定义常量与参数 X <- expression() y <- expression() beta <- expression() n <- 3 # 可替换为实际样本量 LogL_theta <- expression( -0.5 * ( log(det(matrix( c(theta[1] + theta[2], rep(theta[1], n-1), rep(theta[1], n-1), diag(rep(theta[1] + theta[2], n-1))), nrow = n, ncol = n ))) + t(y - X %*% beta) %*% solve(matrix( c(theta[1] + theta[2], rep(theta[1], n-1), rep(theta[1], n-1), diag(rep(theta[1] + theta[2], n-1))), nrow = n, ncol = n )) %*% (y - X %*% beta) ) ) # 一阶导数 dLogL_dtheta <- Deriv(LogL_theta, "theta", vec = TRUE) # 二阶导数 d2LogL_dtheta2 <- Deriv(dLogL_dtheta, "theta", vec = TRUE)
方法2:使用Ryacas包(支持符号化n)
library(Ryacas) # 初始化符号变量 yac_str("n := Symbol('n')") beta <- Sym("beta") theta1 <- Sym("theta[1]") theta2 <- Sym("theta[2]") X <- Sym("X") y <- Sym("y") # 构造V矩阵 V_block1 <- List(theta1 + theta2, Rep(theta1, n-1)) V_block2 <- List(Rep(theta1, n-1), Diag(Rep(theta1 + theta2, n-1))) V <- Sym(List(V_block1, V_block2)) # 构造对数似然函数 LogL <- -0.5 * (Log(Det(V)) + Transpose(y - X %*% beta) %*% Inverse(V) %*% (y - X %*% beta)) # 求导计算 dLogL_dtheta1 <- Deriv(LogL, theta1) dLogL_dtheta2 <- Deriv(LogL, theta2) d2LogL_dtheta11 <- Deriv(dLogL_dtheta1, theta1) d2LogL_dtheta12 <- Deriv(dLogL_dtheta1, theta2) d2LogL_dtheta22 <- Deriv(dLogL_dtheta2, theta2)
错误原因说明
- β求导:未指定
vec=TRUE,Deriv将β视为标量,矩阵乘法项的标量求导被错误简化为0。 - θ求导:矩阵构造的表达式存在语法模糊,
substitute未正确传递V的符号关系,Deriv无法识别θ为变量,返回0结果。
内容的提问来源于stack exchange,提问作者heartofdarkness
相关产品推荐
相关产品推荐

