如何从 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
对象访问 x
和 y
值?
数据确实存在,但它有点隐藏在模型的环境中,模型的环境也保存在对象中,我通过查看 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
非线性最小二乘法(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
对象访问 x
和 y
值?
数据确实存在,但它有点隐藏在模型的环境中,模型的环境也保存在对象中,我通过查看 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