首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Merlin R包- str2lang(x)中出错:<text>:1:30:意外符号

Merlin R包- str2lang(x)中出错:<text>:1:30:意外符号
EN

Stack Overflow用户
提问于 2021-10-19 18:12:43
回答 1查看 83关注 0票数 1

在使用merlin包时,我遇到了一个错误代码的问题,我不知道是什么问题。我知道其他人已经收到了这个错误消息,但我仍然不知道它到底是什么意思。下面是一个示例数据帧,它的结构与我的实际数据相似:

代码语言:javascript
复制
dat = as.data.frame(list(fish = as.factor(c(rep("a",6),rep("b",6),rep("c",6),rep("d",6))),
                         value = as.numeric(c(1,3,7,7,6,7,2,4,8,7,7,6,5,8,10,11,12,10,3,7,9,9,8,9)),
                         time = as.numeric(rep(1:6,4)),
                         location = as.factor(c(rep("0",6),rep("1",6)))))
                    
dat
str(dat)


library(ggplot2)

ggplot(dat, aes(x=time, y=value, group=fish, col=fish)) +
  geom_line()

在这里,实验中有4条鱼(a-d),在每个时间点(6个时间点),为每条鱼测量一个值。location是一个虚拟变量,它告诉我们鱼来自哪里。这里,鱼"a“和"b”来自位置"0“,而鱼"c”和"d“来自位置"1”。

我的目标是检查价值如何随着时间的推移而变化,以及位置是否是一个重要的因素(如果存在重要的时间x位置交互)。我最初将一个受限的三次样条模型拟合到数据中,就像这样,效果很好:

代码语言:javascript
复制
mod1 <- ols(value ~ rcs(time, 3) * location, data = dat, x = TRUE, y = TRUE)

然而,由于随着时间的推移对每条鱼进行了重复测量,该模型是自相关的。为了解决这个问题,我尝试将fish作为随机变量添加到模型中(如果这不是处理自相关的最好方法,请纠正我)。我发现我可以使用merlin包将一个随机变量合并到一个三次样条模型中,如下所示:

代码语言:javascript
复制
library(merlin)

mod2 <- mlrcs(formula = value ~ rcs(time, 3) + location, random  = ~ 1 | fish, data = dat)

但是,这会给出以下错误:

代码语言:javascript
复制
Error in str2lang(x) : <text>:1:22: unexpected symbol
1: value ~rcs(time, 3)  location
                         ^

当我像这样删除"+ location“时,代码运行得很好:

代码语言:javascript
复制
mod3 <- mlrcs(formula = value ~ rcs(time, 3), random  = ~ 1 | fish, data = dat)

我似乎也不能包含交互术语:

代码语言:javascript
复制
mod4 <- mlrcs(formula = value ~ rcs(time, 3) * location, random  = ~ 1 | fish, data = dat)

因为我得到了以下错误消息:

代码语言:javascript
复制
Error in rcs(gml, time, 3) * location : 
  non-numeric argument to binary operator

关于这些错误消息的含义以及我做错了什么,您有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-19 22:23:04

查看其源代码,mlrcs的主要工作是解释您提供的公式并将其传递给merlin::merlin函数。但为了正确解析,提供给mlrcs的公式要求指定截取。您的公式不包括截取,因此您会看到错误消息。此行为可能应添加到“?mlrcs”帮助文件中。

另外,'location‘变量应该是带有0和1的数字。通过这些调整,您的代码符合模型。

代码语言:javascript
复制
dat = as.data.frame(list(fish = as.factor(c(rep("a",6),rep("b",6),rep("c",6),rep("d",6))),
                         value = as.numeric(c(1,3,7,7,6,7,2,4,8,7,7,6,5,8,10,11,12,10,3,7,9,9,8,9)),
                         time = as.numeric(rep(1:6,4)),
                         location = c(rep(0,6),rep(1,6)))) # adjust

library(merlin)

# formula with intercept
mod2 <- mlrcs(formula = value ~  1 + rcs(time, 3) + location, random  = ~ 1 |fish, data = dat)

> summary(mod2)
Restricted cubic splines model
Log likelihood = -30.32352

Estimate Std. Error       z Pr(>|z|) [95% Conf.  Interval]
rcs():1         1.6839262  0.1331443  12.647   0.0000  1.4229681  1.9448843
rcs():2         1.2721426  0.1331443   9.555   0.0000  1.0111846  1.5331006
rcs():3         0.0005585  0.1331444   0.004   0.9967 -0.2603997  0.2615167
location       -3.7102135  0.3665079 -10.123   0.0000 -4.4285559 -2.9918711
_cons           9.2959865  0.2531929  36.715   0.0000  8.7997376  9.7922355
log_sd(resid.) -0.4272951  0.1440364  -2.967   0.0030 -0.7096012 -0.1449890
log_sd(M1)      0.5468268  0.0827878   6.605   0.0000  0.3845657  0.7090879
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69635830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档