如何从 R 中的 nls 模型中检索原始数据?

How to retrieve the original data from nls model in R?

非线性最小二乘法(nls()核心R中的函数)生成一个列表对象,里面有一堆有用的信息,是否还有作为模型输入的原始数据?我怀疑是的,因为 predict()fitted() 函数实际上是在此对象上定义的,并在原始拟合数据的范围内生成预测。那么,如何通过模型对象访问这些数据呢?

想象一下这个设置

# generating some data
generated_data <- hist(rnorm(1000, 50, 10))
data <- data.frame(x = generated_data$mids, y = generated_data$counts) 

# a dummy model
my_model <- nls(y ~ N * dnorm(x, m, s), data=data, start=c(m=55, s=12, N=sum(data$y)) ) 

如何通过 my_model 对象访问 xy 值?

数据确实存在,但它有点隐藏在模型的环境中,模型的环境也保存在对象中,我通过查看 the source code 弄明白了。您可以通过 getEnv() 函数访问输入值,该函数可通过 m 对象访问,并且是 nls.

返回的列表的一部分

所以在虚拟示例中:

# generating some data
generated_data <- hist(rnorm(1000, 50, 10))
data <- data.frame(x = generated_data$mids, y = generated_data$counts) 

# a dummy model
my_model <- nls(y ~ N * dnorm(x, m, s), data=data, start=c(m=55, s=12, N=sum(data$y)) ) 

original_x_values <- my_model$m$getEnv()$x
original_y_values <- my_model$m$getEnv()$y

Broom 具有处理多种模型的良好功能。您可以使用 broom::augment() 获得更多好处:)

如果您不想使用扫帚,那么 Kamil 的答案就可以了。

library(dplyr)
library(broom)
my_model %>% augment()
# A tibble: 13 × 4
      x     y .fitted  .resid
  <dbl> <int>   <dbl>   <dbl>
1  22.5     6    4.27   1.73 
2  27.5    18   15.1    2.88 
3  32.5    45   41.6    3.36 
4  37.5    94   89.1    4.87 
5  42.5   137  148.   -11.3  
6  47.5   191  192.    -0.740
# … with 7 more rows