估计λλ在拟合线,其中Xλxλx ∈ [ 0 , 1 ]x∈[0,1]

机器算法验证 r 回归
2022-03-17 07:53:30

问题

我想在拟合线 lambda ,其中λxλx[0,1]

请注意,R当 x 从增加到时,以下代码会生成“凹”增长。01

Lambda = 1/2.42

x = rbeta(1e4, shape1=2,shape2=2)
y = x^Lambda + rnorm(1e4, sd=.1)

plot(x,y)

尝试

我的方法是建立一个损失函数,L2 损失来找到最优的,就像下面的代码。λR

SumSq = function(lam) sum((y - x^lam )^2)
optimize(SumSq, c(0,1), tol=1e-4, maximum = F )

这段代码假设我知道,并给我一个非常准确的结果。λ(0,1)optimize

但是这种方法不能给出任何统计渐近结果,例如 CI,如果我想考虑不确定性,这是有用的信息。

有没有标准的方法来做到这一点?

2个回答

首先,我建议您阅读本·博尔克 (Ben Bolker) 的一本出色的书,名为《R 中的生态模型和数据》为生态学家写的,我认为这是关于实用数据分析的最佳书籍之一,无论背景如何,我是一名工程师,并且经常使用它。我敢肯定还有其他数理统计书,但是这本书是迄今为止我读过的最实用的书。他还有一个包BBMLE ,您可能想查看它。这本书不同于其他任何书,涉及最大似然估计、轮廓似然和置信区间估计等等。

回到你的问题,你需要写一个你试图拟合数据的函数的对数似然。显然,您假设误差在模拟中呈正态分布,因此对数似然为:

Log Likelihood(Lambda,sd)=n2log(sd)n2log(2π)(yxLambda)22sd

您需要使用优化例程来最大化上述方程,例如optimin R使用Hessian优化中的矩阵来评估估计的对数似然函数的不确定性,即函数在最佳点处的曲率有多陡或多平。如果函数很陡,这意味着在最佳点处的不确定性较小,则参数估计的置信带会更紧,另一方面,如果函数平坦,则置信区间会更宽。Hessian,Fisher 信息矩阵将帮助您计算标准误差和置信区间。

以下是您在 R 中的操作方式:

    set.seed(8345)

Lambda = 1/2.42

x = rbeta(1e4, shape1=2,shape2=2)
y = x^Lambda + rnorm(1e4,mean = 0, sd=.1)

plot(x,y)

## Write Log Likelihood function

log.lik <- function(theta,y,x){

  Lam <- theta[1]
  sigma2 <- theta[2]

  # sample size
  n <-  length(y)

  #error
  e<-y-(x^Lam)

  #log likelihood
  logl<- -.5*n*log(2*pi)-.5*n*log(sigma2)-((t(e)%*%e)/(2*sigma2))

  return(-logl) # R optim does minimize so to maximize  multiply by -1
}

## Estimate Paramters thru maximum likelihood

max.lik <- optim(c(1,1), fn=log.lik, method = "L-BFGS-B", lower = c(0.00001,0.00001), hessian = T,y=y,x=x)

# Lambda
Lam <- max.lik$par[1]
#0.4107119

#Fisher Information MAtrix
fisher_info<-solve(max.lik$hessian)
prop_sigma<-sqrt(diag(fisher_info))

## Estimate 95% Confidence Interval
upper<-max.lik$par+1.96*prop_sigma
lower<-max.lik$par-1.96*prop_sigma


interval<-data.frame(Parameter = c("Lambda","sd"),value=max.lik$par, lower=lower, upper=upper)
interval

有没有标准的方法来做到这一点?

如果您认为以下是一个很好的近似值(以您模拟的模型为例)

yi=xiλ+ϵi,ϵiN(0,σ2)

IE,

log(E(yi))=λlogxi

那么你可以使用glm哪个family = gaussian("log")正是这个模型

lambda <- 1/2.42

set.seed(49564503)
n <- 1e4
x <-  rbeta(n, shape1 = 2,shape2 = 2)
y <-  x^lambda + rnorm(n, sd = .1)

fit <- glm(y ~ log(x) - 1, family = gaussian("log"), start =  c(0, 1))
summary(fit)
#R 
#R Call:
#R glm(formula = y ~ log(x) - 1, family = gaussian("log"), start = 1)
#R 
#R Deviance Residuals: 
#R      Min        1Q    Median        3Q       Max  
#R -0.42452  -0.06767   0.00090   0.07020   0.34418  
#R 
#R Coefficients:
#R        Estimate Std. Error t value Pr(>|t|)    
#R log(x) 0.410666   0.001807   227.3   <2e-16 ***
#R ---
#R Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#R 
#R (Dispersion parameter for gaussian family taken to be 0.01033428)
#R 
#R     Null deviance: 1057.81  on 10000  degrees of freedom
#R Residual deviance:  103.33  on  9999  degrees of freedom
#R AIC: -17341
#R 
#R Number of Fisher Scoring iterations: 5

请注意,色散参数和系数估计值都符合预期。现在,您可以使用上面的标准误差或使用confint.