Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用nls()拟合指数衰减模型中的多个常数?_R_Exponential_Nls_Model Fitting - Fatal编程技术网

R 如何使用nls()拟合指数衰减模型中的多个常数?

R 如何使用nls()拟合指数衰减模型中的多个常数?,r,exponential,nls,model-fitting,R,Exponential,Nls,Model Fitting,我正在处理这种关系: y=h*R+x*v*h 其中: x=(N-M)*exp(-Q*u)+M 这给出了主要方程: y=h*R+v*h*(N-M)*exp(-Q*u)+v*h*M 所有大写字母都是常量,所有小写字母都是变量 我有所有变量的真实数据,但我要么不知道常数(R和Q)的值,要么想检查数据拟合常数(N和M)值的能力。我想使用nls()来拟合方程,使用变量的数据来估计这些常量参数 如何使用nls()函数编写代码来描述主方程,以便从模拟测量数据中估计参数R、N、Q和M?(模拟测量数据=小写字母加

我正在处理这种关系:

y=h*R+x*v*h

其中:

x=(N-M)*exp(-Q*u)+M

这给出了主要方程:

y=h*R+v*h*(N-M)*exp(-Q*u)+v*h*M

所有大写字母都是常量,所有小写字母都是变量

我有所有变量的真实数据,但我要么不知道常数(R和Q)的值,要么想检查数据拟合常数(N和M)值的能力。我想使用nls()来拟合方程,使用变量的数据来估计这些常量参数

如何使用nls()函数编写代码来描述主方程,以便从模拟测量数据中估计参数R、N、Q和M?(模拟测量数据=小写字母加后缀_j,见下文。)

要创建模拟数据,请执行以下操作:

library(dplyr)
library(ggplot2)

### Generate mock data

# Equations:
# y = h*R + x*v*h
# x = (N-M)*exp(-Q*u) + M
# y = h*R + ((N-M)*exp(-Q*u) + M)*v*h
# y = h*R + v*h*(N-M)*exp(-Q*u) + v*h*M

### Variables have varying periodicity,
# and so can be approximated via different functions,
# with unique noise added to each to simulate variability:

# Variability for each variable
n <- 1000 # number of data points
t <- seq(0,4*pi,length.out = 1000)
a <- 3
b <- 2

y.norm <- rnorm(n)
u.norm <- rnorm(n)
u.unif <- runif(n)
v.norm <- rnorm(n)
v.unif <- runif(n)
amp <- 1

# Create reasonable values of mock variable data for all variables except h;
# I will calculate from known fixed values for R, N, Q, and M.

y <- 1.5*a*sin(b*t)+y.norm*amp-10 # Gaussian/normal error
u <- ((1*a*sin(11*b*t)+u.norm*amp)+(0.5*a*sin(13*b*t)+u.unif*amp)+7)/2
v <- 1/((2*a*sin(11*b*t)+v.norm*amp)+(1*a*sin(13*b*t)+v.unif*amp)+20)*800-25

# Put vectors in dataframe
dat <- data.frame("t" = t, "y" = y, "u" = u, "v" = v)

### Create reasonable values for constants:

R=0.5
N=1.12
Q=0.8
M=1

### Define final variable based on these constants and the previous
# mock variable data:

dat$h = y/(R + v*(N-M)*exp(-Q*dat$u))

### Gather data to plot relationships:

dat_gathered <- dat %>%
  gather(-t, value = "value", key = "key")

### Plot data to check all mock variables:

ggplot(dat_gathered, aes(x = t, y = value, color = key)) + geom_line()

# Add small error (to simulate measurement error):

dat <- dat %>%
  mutate(h_j = h + rnorm(h, sd=0.05)/(1/h)) %>%
  mutate(u_j = u + rnorm(u, sd=0.05)/(1/u)) %>%
  mutate(v_j = v + rnorm(v, sd=0.05)/(1/v)) %>%
  mutate(y_j = y + rnorm(y, sd=0.05)/(1/y))
库(dplyr)
图书馆(GG2)
###生成模拟数据
#方程式:
#y=h*R+x*v*h
#x=(N-M)*exp(-Q*u)+M
#y=h*R+((N-M)*exp(-Q*u)+M)*v*h
#y=h*R+v*h*(N-M)*exp(-Q*u)+v*h*M
###变量具有不同的周期性,
#因此可以通过不同的函数来近似,
#将唯一的噪波添加到每个,以模拟可变性:
#每个变量的可变性

n
nls
似乎工作正常,但看起来解决方案(在参数方面)是非唯一的。。。或者我在某个地方犯了个错误

## parameter values chosen haphazardly
n1 <- nls(y ~ h_j*(R + v_j*((N-M)*exp(-Q*u_j)+M)),
    start=list(R=1,N=2,M=1,Q=1),
    data=dat)

## starting from known true values
true_vals <- c(R=0.5,N=1.12,Q=0.8,M=1)
n2 <- update(n1, start=as.list(true_vals))

round(cbind(coef(n1),coef(n2),true_vals),3)
              true_vals
R 0.495 0.495      0.50
N 0.120 0.120      1.12
M 0.001 0.818      0.80
Q 0.818 0.001      1.00
随意选择的参数值 n1