glmmTMB: 在eval(family$initialize) 处发生错误:y的取值必须在 [0, 1] 之间(包含0 和1)

后端开发 2026-07-09

我在尝试使用一个简单的混合效应模型,响应变量为连续变量(% 分数)/100,因此界限在 (0,1) 之间。我有一个离散自变量作为因子,其取值为每周上课2 天或4 天,以及一个随机效应(班次编号,共5 个班次,也作为一个因子设定)。

数据框的结构如下:

> head(data)
  Final_Exam Overall_Percentage Year Semester Section Days Instructor
1     0.9500             0.8900 2026   Spring       1    4     tanner
2     0.6483             0.8956 2026   Spring       1    4     tanner
3     0.9733             0.9872 2026   Spring       1    4     tanner
4     0.9344             0.9777 2026   Spring       1    4     tanner
5     0.8828             0.9443 2026   Spring       1    4     tanner
6     0.8300             0.9313 2026   Spring       1    4     tanner

完整的模型是:

> model.grades.1 = glmmTMB(Overall_Percentage ~ Days + (1|Section), family=beta, data=data)
Error in family() : argument "a" is missing, with no default

我从没见过有人在beta分布中添加一个名为a 的参数,这是不是在让我通过设置一个种子来参数化误差分布,好像包含了一个离散度参数?如果是这样,我应该去哪里查找该怎么做?

或者:

> model.grades.2 = glmmTMB(Overall_Percentage ~ Days + (1|Section), family=ordbeta, data=data)
Error in eval(family$initialize) : y values must be 0 <= y <= 1

但我的响应变量被限定在0 < Overall_Percentage < 1

> summary(Overall_Percentage)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0278  0.8012  0.8904  0.8478  0.9414  0.9999
> which(Overall_Percentage <= 0 | Overall_Percentage >= 1) #check for 0s and 1s
integer(0)

我想使用ordbeta家族,因为看起来它是为这类数据结构设计的,但我还没看到解决这个错误的方法。有什么建议?

> R.Version()  # macbook pro 2019
$platform
[1] "x86_64-apple-darwin20"
$arch
[1] "x86_64"
$os
[1] "darwin20"
$system
[1] "x86_64, darwin20"
$status
[1] ""
$major
[1] "4"
$minor
[1] "5.3"
$year
[1] "2026"
$month
[1] "03"
$day
[1] "11"
$`svn rev`
[1] "89597"
$language
[1] "R"
$version.string
[1] "R version 4.5.3 (2026-03-11)"
$nickname
[1] "Reassured Reassurer"

解决方案

(太长,不能作为评论。)

这看起来没问题(glmmTMB 版本1.1.14,但如果在最近的版本中工作方式不同,我也会感到惊讶……)

library(glmmTMB)
data <- expand.grid(Days = 1:20, Section = factor(1:20))
set.seed(101)
data$Overall_Percentage <- runif(nrow(data), min = 0.02, max = 0.99999)
model.grades.2 = glmmTMB(Overall_Percentage ~ Days + (1|Section), 
     family=ordbeta, data=data)
 model.grades.2
Formula:          Overall_Percentage ~ Days + (1 | Section)
Data: data
      AIC       BIC    logLik -2*log(L)  df.resid 
  8.90981  32.85859   1.54510  -3.09019       394 
Random-effects (co)variances:

Conditional model:
 Groups  Name        Std.Dev.
 Section (Intercept) 0.1239  

Number of obs: 400 / Conditional model: Section, 20

Dispersion parameter for ordbeta family (): 2.13 

lower cutoff estimate: 4.62e-14,    1 

Fixed Effects:

Conditional model:
(Intercept)         Days  
   0.013364     0.005404

所以我猜你需要给我们展示你数据的更多信息。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章