楼主: 梦想信念爱
3117 6

[问答] 关于用r语言极大似然估计参数问题 [推广有奖]

  • 0关注
  • 0粉丝

初中生

9%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.3000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
809 点
帖子
4
精华
0
在线时间
19 小时
注册时间
2020-5-26
最后登录
2024-6-3

楼主
梦想信念爱 发表于 2022-5-5 10:09:48 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我的模型方程为Pr=(((0.5-beta*(A/2))*(V^(alpha)))^(mu))/((((0.5-beta*(A/2))*V^(alpha))^(mu))+(30)*(alpha/mu)),Pr、A和V已知,目标是用极大似然估计参数alpha、beta和mu三个parameter,初学r语言,程序如下:
for(i in 1:1080) {
  #设定随机数生成种子
  set.seed(10086)
  #生成一批实验数据
  # <- 60 # 设定样本容量
  #x <- rnorm(sample_num) # 生成解释变量
  #epsilon <- rnorm(sample_num, sd=2) # 生成模型的扰动项
  Pr <- (((0.5-beta*(A/2))*V^(alpha))^(1/mu))/((((0.5-beta*(A/2))*V^(alpha))^(1/mu))+(30)*(alpha/mu)) # 生成被解释变量
  ## 显然,我们的总体参数是alpha、beta和mu
  # 设定对数似然函数
  Pr <- para0[i,5]
  A <- para0[i,3]
  V <- para0[i,4]
  logf <- function(para) {
    # 定义参数
    alpha <- para[1]
    beta <- para[2]
    mu <- para[3]
    # 计算并返回相应的对数似然函数
    sum(dnorm(Pr-(((0.5-beta*(A/2))*V^(alpha))^(1/mu))/((((0.5-beta*(A/2))*V^(alpha))^(1/mu))+(30)*(alpha/mu)), log = TRUE))
  }
  # 设定初始值
  # 参数位置需与对数似然函数中的参数向量一一对应
  start_para <- c(1, 1, 1)

  # 求解极大似然估计值
  result <- maxLik(logLik = logf, method='NM',start = start_para)

  # 打印估计值
  summary(result)
}


但是输出不了估计值,报错:
>   summary(result)
Error in eigen(hess, symmetric = TRUE, only.values = TRUE) :
  'x'里有无穷值或遗漏值
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:极大似然估计 似然估计 极大似然 R语言 Parameter

沙发
llb_321 在职认证  发表于 2022-5-5 10:41:53
您提供的代码,删了什么东西吗,代码不通啊

藤椅
梦想信念爱 发表于 2022-5-5 13:49:26
感谢您的回复,我后面修改了一下代码,但还是跑不通,我把注释都删了,您能看一下哪有问题吗
for(i in 1:1080) {
  set.seed(10086)
  Pr <- para0[i,5]
  A <- para0[i,3]
  V <- para0[i,4]
  if (A <- 0){
    logf <- function(para) {
      alpha <- para[1]
      mu <- para[2]
      sum(dnorm(Pr-((((0.5)*V^(alpha))^(1/mu))/((((0.5)*V^(alpha))^(1/mu))+(30)*(alpha/mu))), log = TRUE))
    }
    start_para <- c(1, 1)
    result <- maxLik(logLik = logf, method='NM',start = start_para)
    summary(result)
  }else{
    logf <- function(para) {
      alpha <- para[1]
      beta <- para[2]
      mu <- para[3]
      sum(dnorm(Pr-(((0.5-beta*(A/2))*V^(alpha))^(1/mu))/((((0.5-beta*(A/2))*V^(alpha))^(1/mu))+(30)*(alpha/mu)), log = TRUE))
    }
    start_para <- c(1, 1, 1)
    result <- maxLik(logLik = logf, method='NM',start = start_para)
    summary(result)  
  }
}

板凳
梦想信念爱 发表于 2022-5-5 13:54:33
llb_321 发表于 2022-5-5 10:41
您提供的代码,删了什么东西吗,代码不通啊
感谢您的回复,我后面修改了一下代码,但还是跑不通,我把注释都删了,您能看一下哪有问题吗
for(i in 1:1080) {
  set.seed(10086)
  Pr <- para0[i,5]
  A <- para0[i,3]
  V <- para0[i,4]
  if (A <- 0){
    logf <- function(para) {
      alpha <- para[1]
      mu <- para[2]
      sum(dnorm(Pr-((((0.5)*V^(alpha))^(1/mu))/((((0.5)*V^(alpha))^(1/mu))+(30)*(alpha/mu))), log = TRUE))
    }
    start_para <- c(1, 1)
    result <- maxLik(logLik = logf, method='NM',start = start_para)
    summary(result)
  }else{
    logf <- function(para) {
      alpha <- para[1]
      beta <- para[2]
      mu <- para[3]
      sum(dnorm(Pr-(((0.5-beta*(A/2))*V^(alpha))^(1/mu))/((((0.5-beta*(A/2))*V^(alpha))^(1/mu))+(30)*(alpha/mu)), log = TRUE))
    }
    start_para <- c(1, 1, 1)
    result <- maxLik(logLik = logf, method='NM',start = start_para)
    summary(result)  
  }
}

报纸
llb_321 在职认证  发表于 2022-5-6 16:19:28
我用你的代码,把 if (A <- 0)改成 if (A < 0)后,用猜测的para0数据,试了一下:
1、if (A <- 0)这种写法,以前没遇到过,我不确定是否正确,查了帮助文档,觉得您可能是笔误。
2、当测试数据的3、4、5列均为正值时,无报错,有结果。当测试数据改为正负值时,出现你遇到的报错。
3、您代码中,method="NM",按照文档说明,用于constrained MLE,但仅是实验性,并明确提示限制性参数空间的方差-协方差矩阵是错的。
4、改用method="BFGS",虽然有报错,但有结果,summary(result)提示收敛。
数据、似然函数、代码的参数,可以从这三个方面找找原因吧。
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

地板
Rachel-L 发表于 2023-2-26 19:45:39
你好,我是R小白,请问para0是如何来的?

7
oliyiyi 发表于 2023-2-27 14:19:58

这个错误通常是因为对数似然函数的参数取值不合理,导致计算出来的似然函数值为无穷大或者NaN(Not a Number)。这会导致 Hessian 矩阵计算出错,进而导致程序报错。

你可以尝试检查以下几个方面:

  • 确保你的数据生成代码能够正确生成 Pr 的值,并且 Pr 的值没有缺失或者为无穷大或NaN。

  • 确保初始值 start_para 和估计函数 logf 中的参数一一对应,并且初始值取值合理。

  • 尝试更改优化算法的 method 参数。目前你的程序使用了 Nelder-Mead 算法,你可以尝试使用其他优化算法,如 BFGS 或 L-BFGS-B 算法,来检查是否能够得到更好的结果。

  • 确认一下 logf 中的对数似然函数是否正确。你可以尝试将参数带入对数似然函数中手动计算一下,看看是否能得到正确的结果。


希望以上建议能够帮助你找到问题所在,并且顺利得到估计结果。


缺少币币的网友请访问有奖回帖集合
https://bbs.pinggu.org/thread-3990750-1-1.html

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 05:13