【问题标题】:Getting Error in parse(text = paste("~", paste(nVal, collapse = "/"))) : <text>:2:0: unexpected end of input when running nlme package in R解析出错(文本 = 粘贴(“~”,粘贴(nVal,折叠 =“/”))):<文本>:2:0:在 R 中运行 nlme 包时输入意外结束
【发布时间】:2021-08-16 03:51:59
【问题描述】:

我正在尝试使用 nlme 包将第二类分布的广义 beta 拟合到模拟的健康成本数据。

在测试数据集上运行以下代码:

包安装(如有必要)

install.packages("withr", dependencies = T)
library(withr)
with_makevars(c(PKG_CFLAGS ="-std=gnu99"), 
       install.packages("cubature"), assignment="+=") 
install.packages("GB2", dependencies = T)
    install.packages("nlme", dependencies = T)

# load packages
library(cubature)
library(GB2)
library(nlme)

# Binary independent variables
age <- rbinom(n=1000, size=1, prob=.3)
sex <- rbinom(n=1000, size=1, prob=.5)
trmt <- rbinom(n=1000, size=1, prob=.5)

# GB2 parameter equations
shape1 <- exp(rnorm(n=1000, mean=.1 + age/100 - sex/10 + trmt/10, sd=.3))
scale <- exp(rnorm(n=1000, mean=7 + age/50 + sex - trmt, sd=.5))
shape2 <- exp(rnorm(n=1000, mean=1.5 + age/100 + sex/10 - trmt/10, sd=.3))
shape3 <- exp(rnorm(n=1000, mean=.5 + age/100 - sex/10 - trmt/10, sd=.3))

# Outcome
y <- rgb2(1000, shape1, scale, shape2, shape3)

# Create test dataset
df <- data.frame(cbind(y,age,sex,trmt,shape1,scale,shape2,shape3))

# Fit GB2 distribution to data
gb2_fit <- nlme(y ~ scale*beta(shape2 + 1/shape1, shape3 - 1/shape1)/beta(shape2, shape3),
           # data = list(y=df_gb2_test[,1]),
           data = df,
           fixed = list(shape1 ~ age + sex + trmt, 
                        scale ~ age + sex + trmt, 
                        shape2 ~ age + sex + trmt, 
                        shape3 ~ age + sex + trmt),
           start = list(fixed = c(shape1 = 1.00, scale = 100, shape2 = 1.00, shape3 = 1.00)))

我得到错误:

Error in parse(text = paste("~", paste(nVal, collapse = "/"))) : 
  <text>:2:0: unexpected end of input
1: ~ 
   ^

任何想法我做错了什么?我似乎正确地使用了波浪号运算符。

【问题讨论】:

    标签: r parsing nlme


    【解决方案1】:

    我认为nlme 没有做你认为它做的事情。它做非线性最小二乘 混合模型;即,假设响应是高斯的,并且假设存在随机效应(也许您将此与更通用的 SAS PROC NLMIXED 混淆了?

    library(bbmle)
    
    ## we need a version of the density function that takes a 'log' argument
    dgb2B <- function(..., log=FALSE) {
      r <- GB2::dgb2(...)
      if (!log) r else log(r)
    }
    
    ## don't include shape1, scale shape2, shape3 in the data, that confuses things
    df2 <- df[,c("y","age","sex", "trmt")]
    
    
    ## fit homogeneous model
    m1 <- mle2(y ~ dgb2B(shape1, scale, shape2, shape3),
         method="Nelder-Mead",
         trace=TRUE,
         data=df2,
         start = list(shape1 = 1.00, scale = 100, shape2 = 1.00, shape3 = 1.00))
    
    ## allow parameters to vary by group 
    mle2(y ~ dgb2B(shape1, scale, shape2, shape3),
         ## parameters need to be in the same order!
         parameters=list(shape1 ~ age + sex + trmt,
                         scale ~ age + sex + trmt,
                         shape2 ~ age + sex + trmt,
                         shape3 ~ age + sex + trmt),
         method="Nelder-Mead",
         control=list(maxit=10000,
                      ## set parameter scales equal to magnitude
                      ## of starting values; each top-level parameter
                      ## has 4 associated values (intercept, + 3 cov effects)
                      parscale=rep(abs(coef(m1)), each=4)),
         trace=TRUE,
         data=df2,
         start = as.list(coef(m1))
    )
    

    对于它的价值,对于这个例子,你可以通过将八个不同的模型拟合到所有年龄 × 性别 × 治疗组来实现相同的目标(但我可以理解你的实际应用可能更复杂,即你可能只希望参数的子集在组之间变化,或者可能希望允许参数根据连续协变量变化。

    如果您要尝试更难的问题,您可能希望在对数刻度上拟合参数。

    【讨论】:

    • 太棒了,谢谢 - 是的,我确实将 nlmeproc nlmixed 混淆了。看起来 mle2 是我想要的,这样我就不用手动编写 GB2 分布的对数似然解决方案了。
    • GB2 包确实包含函数LogDensity()LogLikelihood(),它们分别计算GB2 分布在指定参数值下的对数密度和对数似然。我可以使用其中一个作为mle2 函数中的第一个参数,例如mle2((-1)*(GB2::LogLikelihood(shape1, scale, shape2, shape3)), parameters=list(....), method="Nelder-Mead", etc.)?还有一个MLfullGB2(),它根据全对数似然计算GB2的最大似然估计,但不要认为它接受由单独模型估计的参数。
    • 你不一定期望模型收敛到完全相同的参数......测试它是否工作的更彻底的方法是适应许多具有相同真实参数的模拟数据集并表明估计参数的平均值等于/接近真实值(即无偏估计)
    • 如果你使用梯度信息,我认为你可以做得比这更好。这是可能的,但比我想要的有点痛苦/更多细节;如果您要做很​​多此类事情,那将是值得的……
    • 并非专门针对 GB2 解决方案,但在 github.com/queezzz/qzmle
    【解决方案2】:

    之前还发生了一个错误:

    y <- rgb2(1, shape1, scale, shape2, shape3)
    Error in rgb2(1, shape1, scale, shape2, shape3) : 
      could not find function "rgb2"
    

    您可能需要为此加载所需的包:

    https://www.rdocumentation.org/packages/gamlss.dist/versions/5.3-2/topics/GB2

    它似乎在library(gamlss.dist)

    【讨论】:

    • 是的,rgb2() 函数包含在 GB2 软件包中,但是一旦您安装了 GB2,它应该可以正常运行。
    • 抱歉有错别字 - 应该是y &lt;- rgb2(1000, shape1, scale, shape2, shape3)
    猜你喜欢
    • 2013-08-30
    • 2017-01-03
    • 2014-10-03
    • 1970-01-01
    • 2020-10-11
    • 2017-03-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多