最大似然估计

4

我是一个新的R用户,希望你能体谅我的问题可能有些愚蠢。我想使用R中的最大似然估计器来估算以下模型。

y= a+b*(lnx-α)

其中a、b和α是要估计的参数,X和Y是我的数据集。我尝试使用从网上获取的以下代码:

library(foreign)
maindata <- read.csv("C:/Users/NUNU/Desktop/maindata/output2.csv")
h <- subset(maindata, cropid==10)
library(likelihood)
modelfun <- function (a, b, x) { b *(x-a)}
par <- list(a = 0, b = 0)
var<-list(x = "x")
par_lo <- list(a = 0, b = 0)
par_hi <- list(a = 50, b = 50)
var$y <- "y"
var$mean <- "predicted"
var$sd <- 0.815585
var$log <- TRUE
results <- anneal(model = modelfun, par = par, var = var,
            source_data = h, par_lo = par_lo, par_hi = par_hi,
            pdf = dnorm, dep_var = "y", max_iter = 20000)

我得到的结果相似,尽管数据不同,即使我更改了cropid。同样,生成的预测值是针对x而不是y。 我不知道我错过了什么或做错了什么。非常感谢您的帮助。

1
这里有几个问题。(1)最好提供一个可重现的例子(http://tinyurl.com/reproducible-000)。(2)正如您最初所述,该模型是*不可识别的*;它相当于在`ln(x)`上对`y`进行线性模型的斜率=`b`和截距`a-αb`的参数--也就是说,您正在尝试从本质上是二参数模型的内容中估计三个参数。(3)由于您将`pdf`指定为`dnorm`,因此正如David Winsemius所说,这实际上是一个简单的线性模型。不太重要的是,(4)foreign包是不必要的... - Ben Bolker
cropid 是什么?在 help(anneal) 页面中有一个非常相似的例子,使用 "x" 作为因变量。您知道模拟退火不是一种确定性方法,对于小差异您没有必要担心。 - IRTFM
2个回答

4

我不确定您的模型公式是否会导致唯一解,但通常情况下您可以使用optim函数找到MLE。

以下是使用optim进行线性回归的简单示例:

fn <- function(beta, x, y) {
a = beta[1]
b = beta[2]

    sum( (y - (a + b * log(x)))^2 ) 
}

# generate some data for testing
x = 1:100

# a = 10, b = 3.5
y = 10 + 3.5 * log(x)

optim(c(0,0,0),fn,x=x,y=y,method="BFGS")

您可以更改函数 "fn" 来反映您的模型公式,例如:

sum( (y - (YOUR MODEL FORMULA) )^2 )

编辑

我只是举了一个简单的例子,说明在你有一个自定义模型公式需要优化时如何使用optim。我并不是指在简单的线性回归中使用它,因为lm已经足够。


2

我有些惊讶,iTech在参数呈线性问题时使用了optim。以下是他的x和y数据:

> lm(y ~ log(x) )

Call:
lm(formula = y ~ log(x))

Coefficients:
(Intercept)       log(x)  
       10.0          3.5  

对于线性问题,最小二乘解是极大似然解。


1
我只是举了一个使用optim的简单例子。我理解问题需要优化一个自定义函数,而不仅仅是对带有log(x)转换的普通线性回归进行优化。 - iTech
OP可能仍需要关于likelihood::anneal函数设置的帮助,但首先他需要提供一个可重现的示例。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接