【问题标题】:nls not working despite df and initial values defined尽管定义了 df 和初始值,但 nls 不起作用
【发布时间】:2022-10-24 22:13:35
【问题描述】:

我不知道我哪里错了。我不断得到:

对象 [[i]] 中的错误:“闭包”类型的对象不是子集

当我在一个简单的数据框上运行它时,同样的代码可以工作,但是对于嵌套数据,它会导致问题。

library(tidyverse)
data1 <- data.frame( 
z = c("1a","1a","1a","1b","1b","1b","2a","2a","2a","2b","2b","2b"),
Q = c(1,2,3,4,4,5,6,7,7,8,8,0),
J = c(2,4,5,6,7,8,3,7,9,1,34,2)
)

Ye_mod <- function(Q, alpha, beta, gamma) (alpha*((1-beta*Q) / (1 + gamma*Q))*Q)

JQ_fit <- function(df){
    initial_vals <- list(alpha = 0.9, beta = 0.00009, gamma = 0.003)
    nls(J ~ Ye_mod(Q, alpha, beta, gamma), data=df, start = initial_vals)
    summary(JQ_fit)
    fit_coefs <- coef(JQ_fit)
    alpha_fit <- fit_coefs[1]
    beta_fit <- fit_coefs[2]
    gamma_fit <- fit_coefs[3]
    J_fit <- predict(QJ_fit)
  
    PARsat <- (sqrt((beta_fit+gamma_fit)/beta_fit) - 1) / gamma_fit
    Jmax <- alpha_fit*((sqrt(beta_fit+gamma_fit) - sqrt(beta_fit))/gamma_fit)^2
  
}
  


#Tibble
data2 = 
  nest(data1, data = c(Q, J))

data2
data2 %>% pull(data)

JQ_fit(data2$data[[1]])

【问题讨论】:

  • 我得到一个奇异的梯度错误,这并不奇怪,因为在这个例子中你试图将一个 3 参数模型拟合到 3 个数据点......
  • PS,如果您尽可能避免将事物命名为“数据”,这将帮助您避免这种令人困惑的错误(例如,如果您只输入 data[[1]] 本身,而在您的工作区中没有名为 data 的数据对象,您将得到“ 'closure' 类型的对象 ...”,因为 data() 是 R 中的内置函数 ...
  • 到目前为止,我无法重现这一点;投票结束。 (如果我在这里完全按照在干净的 R 会话中编写的代码运行代码,我不会收到您描述的错误。)

标签: r nls


【解决方案1】:

正如在 cmets 中所指出的,您不太可能得到任何合理的尝试来拟合只有 3 个数据点的 3 参数模型。

建议您只使用线性模型。

library(nlme)

fo <- J ~  Q | z
fm <- lmList(fo, data1); fm

## Call:
##   Model: J ~ Q | z 
##    Data: data1 
##
## Coefficients:
##    (Intercept)      Q
## 1a   0.6666667 1.5000
## 1b   0.5000000 1.5000
## 2a -27.0000000 5.0000
## 2b   2.0000000 1.9375
##
## Degrees of freedom: 12 total; 4 residual
## Residual standard error: 11.6958

library(lattice)
xyplot(fo, data1, type = c("p", "r"), as.table = TRUE)

【讨论】:

    【解决方案2】:

    谢谢大家的回答。我放在这里的数据是一个不好的例子,我意识到,但原来的数据太大而且太乱了。无论如何,我解决了它与 tibble 和列表差异以及在函数内部定义变量有关的问题。 谢谢!

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多