- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 nlme 和 lsoda 拟合一阶微分模型。基本思想如下:我首先定义允许生成微分方程解的函数:
library(deSolve)
ODE1 <- function(time, x, parms) {with(as.list(c(parms, x)), {
import <- excfunc(time)
dS <- import*k/tau - (S-yo)/tau
res <- c(dS)
list(res)})}
solution_ODE1 = function(tau1,k1,yo1,excitation,time){
excfunc <- approxfun(time, excitation, rule = 2)
parms <- c(tau = tau1, k = k1, yo = yo1, excfunc = excfunc)
xstart = c(S = yo1)
out <- lsoda(xstart, time, ODE1, parms)
return(out[,2])
}
然后,我按照两个 ID 的公式生成数据:
time <- 0:49
excitation <- c(rep(0,10),rep(1,10),rep(0,10),rep(1,10),rep(0,10))
simu_data <- data.frame(signal = c(solution_ODE1(3,2,0.1,excitation,time)+rnorm(length(time),0,0.1),
solution_ODE1(3.2,1.5,0.3,excitation,time)+rnorm(length(time),0,0.1)),
time = rep(time,2),
excitation = rep(excitation,2),
ID = rep(c("A","B"),each = length(time)))
它是这样的:
library(ggplot2)
ggplot(simu_data)+
geom_point(aes(time,signal,color = "signal"),size = 2)+
geom_line(aes(time,excitation,color = "excitation"))+
facet_wrap(~ID)
然后我尝试使用 nlme 进行拟合:
fit1 <- nlme(signal ~ solution_ODE1(damping,gain,eq,excitation,time),
data = simu_data,
fixed = damping + gain + eq ~1,
random = damping ~ 1 ,
groups = ~ ID,
start = c(damping = 5, gain = 1,eq = 0))
我遇到了这个错误,但我没有得到:
Error in eval(substitute(expr), data, enclos = parent.frame()) : object 'k' not found
traceback
显示错误来自 ODE1 模型,该模型在生成值时起作用。
16. eval(substitute(expr), data, enclos = parent.frame())
15. eval(substitute(expr), data, enclos = parent.frame())
14. with.default(as.list(c(parms, x)), {
import <- excfunc(time)
dS <- import * k/tau - (S - yo)/tau
res <- c(dS) ...
13. with(as.list(c(parms, x)), {
import <- excfunc(time)
dS <- import * k/tau - (S - yo)/tau
res <- c(dS) ...
12. func(time, state, parms, ...)
11. Func2(times[1], y)
10. eval(Func2(times[1], y), rho)
9. checkFunc(Func2, times, y, rho)
8. lsoda(xstart, time, ODE1, parms)
7. solution_ODE1(damping, gain, eq, excitation, time)
6. eval(model, data.frame(data, pars))
5. eval(model, data.frame(data, pars))
4. eval(modelExpression[[2]], envir = nlEnv)
3. eval(modelExpression[[2]], envir = nlEnv)
2. nlme.formula(signal ~ solution_ODE1(damping, gain, eq, excitation,
time), data = simu_data, fixed = damping + gain + eq ~ 1,
random = damping ~ 1, groups = ~ID, start = c(damping = 5,
gain = 1, eq = 0))
1. nlme(signal ~ solution_ODE1(damping, gain, eq, excitation, time),
data = simu_data, fixed = damping + gain + eq ~ 1, random = damping ~
1, groups = ~ID, start = c(damping = 5, gain = 1, eq = 0))
有人知道我应该如何进行吗?
<小时/>我尝试按照mikeck的建议进行修改:
ODE1 <- function(time, x, parms) {
import <- parms$excfunc(time)
dS <- import*parms$k/parms$tau - (x["S"]-parms$yo)/parms$tau
res <- c(dS)
list(res)}
生成数据没有问题。但是使用 nlme
现在给出:
Error in checkFunc(Func2, times, y, rho) : The number of derivatives returned by func() (0) must equal the length of the initial conditions vector (100)
具有以下回溯:
> traceback()
10: stop(paste("The number of derivatives returned by func() (",
length(tmp[[1]]), ") must equal the length of the initial conditions vector (",
length(y), ")", sep = ""))
9: checkFunc(Func2, times, y, rho)
8: lsoda(xstart, time, ODE1, parms) at #5
7: solution_ODE1(damping, gain, eq, excitation, time)
6: eval(model, data.frame(data, pars))
5: eval(model, data.frame(data, pars))
4: eval(modelExpression[[2]], envir = nlEnv)
3: eval(modelExpression[[2]], envir = nlEnv)
2: nlme.formula(signal ~ solution_ODE1(damping, gain, eq, excitation,
time), data = simu_data, fixed = damping + gain + eq ~ 1,
random = damping ~ 1, groups = ~ID, start = c(damping = 5,
gain = 1, eq = 0))
1: nlme(signal ~ solution_ODE1(damping, gain, eq, excitation, time),
data = simu_data, fixed = damping + gain + eq ~ 1, random = damping ~
1, groups = ~ID, start = c(damping = 5, gain = 1, eq = 0))
最佳答案
在您的示例中,您的 times
向量并不是单调运行的。我认为这与 lsoda 有点困惑。时间在这里运作的方式的背景/意义是什么?将随机效应模型与两组进行拟合并没有多大意义。您是否想将同一条曲线拟合到两个独立的时间序列?
这是一个经过一些调整的精简示例(并非所有内容都可以折叠为数字向量而不丢失必要的结构):
library(deSolve)
ODE1 <- function(time, x, parms) {
with(as.list(parms), {
import <- excfunc(time)
dS <- import*k/tau - (x-yo)/tau
res <- c(dS)
list(res)
})
}
solution_ODE1 = function(tau1,k1,yo1,excitation,time){
excfunc <- approxfun(time, excitation, rule = 2)
parms <- list(tau = tau1, k = k1, yo = yo1, excfunc = excfunc)
xstart = yo1
out <- lsoda(xstart, time, ODE1, parms)
return(out[,2])
}
time <- 0:49
excitation <- c(rep(0,10),rep(1,10),rep(0,10),rep(1,10),rep(0,10))
simu_data <- data.frame(time = rep(time,2),
excitation = rep(excitation,2))
svec <- c(damping = 3, gain = 1.75, eq = 0.2)
这有效:
with(c(simu_data, as.list(svec)),
solution_ODE1(damping,gain,eq,excitation[1:50],time[1:50]))
但是如果我们再添加一个步骤(以便时间重置为 0),则会失败:
with(c(simu_data, as.list(svec)),
solution_ODE1(damping,gain,eq,excitation[1:51],time[1:51]))
Error in lsoda(xstart, time, ODE1, parms) : illegal input detected before taking any integration steps - see written message
关于r - 使用 nlme 和 lsoda 拟合一阶方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56254840/
我正在尝试运行一个线性混合模型,在 57 个不同的时间点重复测量。但我不断收到错误消息: Error in solve.default(estimates[dimE[1L] - (p:1), dimE
我目前正在使用 nlme 执行混合效果回归。 我想通过为 nlme 调用中的参数提供上限和下限来执行约束优化。 这可能吗? 最佳答案 如果将上限定义为向量 upper_bounds,其长度与传递给 n
我正在尝试将交叉非线性随机效应模型拟合为前面提到的线性随机效应模型 in this question在这个 mailing list post使用 nlme 包。不过,无论我尝试什么,我都会收到错误。
我试图从使用 lme 构建的模型中提取随机结构,但除了固定公式之外,我似乎什么也得不到。例如。, library(nlme) fm1 <- lme(distance ~ age, Orthodont,
library(nlme) model model2 Nonlinear mixed-effects model fit by maximum likelihood Model: height
线性混合效应模型传统上按以下方式制定。 Ri = Xi × β + Zi × bi + εi 其中 β 代表估计的固定效应,Z 代表随机效应。 X 因此是经典设计矩阵。使用 R,我希望能够在使用 nl
library(nlme) Loblolly$age2 <- as.factor(ifelse(Loblolly$age < 12.5, 0, 1)) 在这里我定义了一个我感兴趣的二元协变量。 mod
我在线性混合模型中有两个因素。因子 A 被视为固定效应,因子 B 被视为随机效应并嵌套在因子 A 中。谁能告诉我如何使用 nlme R 包做到这一点? 我知道 lme( response~ facto
我可以使用 summary(fm1) 从 nlme 摘要中提取固定效果.但苦于如何获得Random effects:部分。 fm1 VarCorr(fm1) Subject = pdLogChol(a
当我在 nlme 中拟合数据时,我第一次尝试从未成功,之后 nlme(fit.model)我习惯于看到这样的事情: Error in nlme.formula(model = mass ~ SSbgf
我有使用以下代码的包 NLME 的问题: library(nlme) x <- rnorm(100) z <- rep(c("a","b"),each=50) y <- rnorm(100) test
我有一个混合效应模型,我想删除随机效应协方差矩阵中的一些相关性以减少自由度。为此,我认为我应该使用 pdBlocked 但无法获得正确的语法来获得我想要的具体内容。 示例代码: library(nlm
我正在尝试构建一个标准的 translog 需求函数,它是: lnY = lnP + lnZ + lnY*lnZ + lnY^2 + lnZ^2 其中 Y = 需求,P = 价格,Z = 收入。 但是
我已经使用 nlme() 安装了一个模型来自 package nlme . 现在我想模拟一些预测区间,考虑到参数的不确定性。 为此,我需要提取固定效应的方差矩阵。 据我所知,有两种方法可以做到这一点:
我想使用 nlme::lme 在模型中指定不同的随机效应(底部数据)。随机效应是:1) intercept和 position变化超过 subject ; 2) intercept变化超过 compa
我有长格式的纵向数据,对于前两个主题,它看起来像这样: id X M Y 1 1 0 M1 2.53 2 1 0 M2 1.45 3 1 0 M3 1.17 4 1 0 M
我使用 nlme 包计算了一个线性混合模型。我正在评估心理治疗并使用治疗条件和测量点作为预测指标。我使用 emmans 包进行了事后比较。到目前为止一切顺利,一切顺利,我期待着完成我的论文。只剩下一个
我正在尝试构建一个 nonlinear mixed effects model COVID-19 数据与来自不同国家的每日病例数拟合成钟形曲线(随机效应在国家层面)。 数据表太大,无法包含在帖子中,但
有没有办法在 nlme 包 lme 模型中获得随机项的方差? Random effects: Formula: ~t | UID Structure: General positive-defin
我尝试使用 nlme 和 lsoda 拟合一阶微分模型。基本思想如下:我首先定义允许生成微分方程解的函数: library(deSolve) ODE1 编辑 我尝试按照mikeck的建议进行修改:
我是一名优秀的程序员,十分优秀!