荣和;在R中使用mle输出的Clarke测试?

荣和;在R中使用mle输出的Clarke测试?,r,testing,mle,goodness-of-fit,R,Testing,Mle,Goodness Of Fit,我想测试我在R中使用stats4::mle拟合的两个非嵌套模型中的哪一个使用Vuong和Clarke测试提供了更好的拟合 Vuong(计量经济学,1989年): 克拉克(政治分析,2007年): 下面是我正在拟合的一小部分数据,两种不同的模型(函数“w”不同)和相应的mle() 库(stats4) ###资料 z1在“游戏”软件包(包括Vuong和Clarke针对最后通牒游戏的测试)作者的帮助下,我能够为MLE优化编写测试代码 重要的是,应该在最佳参数集记录每个数据点的对数似然度,这可以通过

我想测试我在R中使用stats4::mle拟合的两个非嵌套模型中的哪一个使用Vuong和Clarke测试提供了更好的拟合

  • Vuong(计量经济学,1989年):
  • 克拉克(政治分析,2007年):
下面是我正在拟合的一小部分数据,两种不同的模型(函数“w”不同)和相应的mle()

库(stats4)
###资料

z1在“游戏”软件包(包括Vuong和Clarke针对最后通牒游戏的测试)作者的帮助下,我能够为MLE优化编写测试代码

重要的是,应该在最佳参数集记录每个数据点的对数似然度,这可以通过在全局变量中保存“ll”来完成。该向量在优化过程的最终迭代中所取的值正是所需的向量,可以通过求和并将其与logLike(拟合)进行比较轻松地进行检查

通过拟合和个体密度,可以定义Vuong和Clarke检验

### Define tests
vuong.test <- function(fit1,fit2,ldens1,ldens2,alternative) 
{
  if(nobs(fit1) != nobs(fit2)){return("Error: number of observations used to fit the models unequal")}
  n.obs <- nobs(fit1)
  n.par1 <- nrow(coef(summary(fit1)))
  n.par2 <- nrow(coef(summary(fit2)))

  LR <- sum(ldens1) - sum(ldens2) - (n.par1-n.par2)/2*log(n.obs)
  LDdif <- sqrt(sum((ldens1 - ldens2)^2)/n.obs)
  z = LR/(sqrt(n.obs)*LDdif)

  alternative <- substr(alternative,1,1) ## alternative specifies whether you test whether fit1 is lesser, greater or equal to fit2.
  if(alternative == "l"){pval = pnorm(z,mean = 0,sd = 1)}
  if(alternative == "g"){pval = 1-pnorm(z,mean = 0,sd = 1)}
  if(alternative == "t"){pval = 2*pnorm(-abs(z),mean = 0,sd = 1)}

  return(pval)
}

clarke.test <- function(fit1,fit2,ldens1,ldens2,alternative)
{
  if(nobs(fit1) != nobs(fit2)){return("Error: number of observations used to fit the models unequal")}
  n.obs <- nobs(fit1)
  n.par1 <- nrow(coef(summary(fit1)))
  n.par2 <- nrow(coef(summary(fit2)))

  correction <- (n.par1-n.par2)*(log(n.obs)/(2*n.obs))
  z = sum(ldens1 - ldens2 > correction)

  alternative <- substr(alternative,1,1) ## alternative specifies whether you test whether fit1 is lesser, greater or equal to fit2.
  if(alternative == "l"){pval = pbinom(q = z,size=n.obs,prob = 0.5)}
  if(alternative == "g"){pval = 1-pbinom(q = z,size=n.obs,prob = 0.5)}
  if(alternative == "t"){zz <- min(z,n.obs-z); pval = 2*pbinom(q = zz,size=n.obs,prob = 0.5)}

  return(pval)
}
考虑到第三种模式:

##### Model 3
w3 <- function(p,a,b){return(p)}
w <- w3

### LL3
LL3 <- function(n,s)
{
  V = (v(z1,n)-v(z2,n))*w(p,a,b) + v(z2,n) 
  res = zce - v.inv(V,n)
  ll = dnorm(res, 0, s,log=T)
  ll.fin3 <<- ll
  -sum(ll)
}

### mle 3
fit.model3 <- mle(LL3,
                  start = list(n = 0.1,s=0.1),
                  method = "L-BFGS-B",
                  lower = list(n=-Inf,s=0.0001),
                  upper = list(n=0.9999, s=Inf),
                  control = list(maxit = 500, ndeps = rep(0.000001,2)),
                  nobs=length(z1))

游戏套餐:

仅要求套餐推荐的问题可以被视为离题。描述你到底需要做什么,如果需要打包,我们会建议你做一个,但不要假设一个简单的计算不能用R来给你你所需要的。对于这个问题,你应该在这里定义“Vuong/Clarke测试”(一个仔细的描述或至少一个参考)。你到底需要计算什么?你在哪里被卡住了?另外,在你的问题中编辑评论以证明不投票是正确的做法。反对票是匿名的,无法确定它是否会回到相关人员手中。这种类型的讨论可能更适合meta stackoverflow站点:(尽管我不是100%确定)。评论可能仍然比编辑成问题的帖子要好。@Flick先生非常感谢你的帮助,我完全明白你的意思。我希望编辑后的问题更好。
> vuong.test(fit1 = fit.model1, ldens1 = ll.fin1,
+            fit2 = fit.model2, ldens2 = ll.fin2,
+            alternative = "t")
[1] 0.5842877
##### Model 3
w3 <- function(p,a,b){return(p)}
w <- w3

### LL3
LL3 <- function(n,s)
{
  V = (v(z1,n)-v(z2,n))*w(p,a,b) + v(z2,n) 
  res = zce - v.inv(V,n)
  ll = dnorm(res, 0, s,log=T)
  ll.fin3 <<- ll
  -sum(ll)
}

### mle 3
fit.model3 <- mle(LL3,
                  start = list(n = 0.1,s=0.1),
                  method = "L-BFGS-B",
                  lower = list(n=-Inf,s=0.0001),
                  upper = list(n=0.9999, s=Inf),
                  control = list(maxit = 500, ndeps = rep(0.000001,2)),
                  nobs=length(z1))
> vuong.test(fit1 = fit.model1, ldens1 = ll.fin1,
+             fit2 = fit.model3, ldens2 = ll.fin3,
+             alternative = "t")
[1] 0.1823776
> 
> clarke.test(fit1 = fit.model1, ldens1 = ll.fin1,
+             fit2 = fit.model3, ldens2 = ll.fin3,
+             alternative = "t")
[1] 0.01915729