R 负指数函数的跨站点全局优化

R 负指数函数的跨站点全局优化,r,optimization,global,R,Optimization,Global,试图估计适合整个研究的最佳参数。每项研究都有不同长度的数据集,需要了解在剩余变量和时间变量之间拟合负指数模型的最佳参数。样本数据集如下: Study <- as.factor(c(1, 1, 1, 1, 2, 2, 2, 3, 3)) Time <- as.numeric(c(0, 0.08, 0.16, 0.24, 0, 0.05, 0.88, 0, 0.99)) Remaining <- as.numeric(c(100, 80, 69, 45, 100, 60, 35,

试图估计适合整个研究的最佳参数。每项研究都有不同长度的数据集,需要了解在剩余变量和时间变量之间拟合负指数模型的最佳参数。样本数据集如下:

Study <- as.factor(c(1, 1, 1, 1, 2, 2, 2, 3, 3))
Time <- as.numeric(c(0, 0.08, 0.16, 0.24, 0, 0.05, 0.88, 0, 0.99))
Remaining <- as.numeric(c(100, 80, 69, 45, 100, 60, 35, 0, 25))
data_n <- cbind(Study, Time, Remaining)
head(data_n)

Study首先,我从您的数据创建一个数据框。接下来,我将定义适合数据的函数,它将拟合参数
p
time
作为参数。然后,我创建一个成本函数,计算平方和作为拟合质量的度量。之后,我使用
optim
最小化成本函数,最后绘制结果

# Create data frame
data_n <- data.frame(Study, Time, Remaining)

# Function to be fit
fit_function <- function(p, time){
  (41 * exp(-p[1] * time) + 59 * exp(-p[2] * time))
}

# Cost function using the sum of squares
cost_function <- function(p, data){
  sum((data$Remaining - fit_function(p, data$Time))^2)
}

# Using 'optim' to minimise the cost function
fit <- optim(c(1, 1), cost_function, data = data_n)

# Plot results
plot(data_n$Time, data_n$Remaining, xlab = "Time", ylab = "Remaining")
lines(seq(0, 1, by = 0.1), fit_function(fit$par, seq(0, 1, by = 0.1)))
#创建数据帧

谢谢你,林巴克。是否可以使用相同的方法,在所有“研究”站点中找到最佳解决方案?这是因为每个“研究”都是一个快速的研究。我认为这有点像一个全局优化。我不确定你所说的“所有研究地点的最佳解决方案”是什么意思。给出的答案提供了考虑到所有研究地点的最佳拟合度。或者你想将其与每个研究的数据分别拟合吗?(考虑到站点3只有两个观测值,我不确定这是否可行。)谢谢,Lyngbakr。我认为这是一个全局优化,我们可以混合所有站点的所有数据。是否可以添加一个约束条件,说明-p[1]的负值高于-p[2]。示例-p[1]可以是-5和-p[2]可以是-2。请查看optim,因为它解释了如何约束参数值。
# Create data frame
data_n <- data.frame(Study, Time, Remaining)

# Function to be fit
fit_function <- function(p, time){
  (41 * exp(-p[1] * time) + 59 * exp(-p[2] * time))
}

# Cost function using the sum of squares
cost_function <- function(p, data){
  sum((data$Remaining - fit_function(p, data$Time))^2)
}

# Using 'optim' to minimise the cost function
fit <- optim(c(1, 1), cost_function, data = data_n)

# Plot results
plot(data_n$Time, data_n$Remaining, xlab = "Time", ylab = "Remaining")
lines(seq(0, 1, by = 0.1), fit_function(fit$par, seq(0, 1, by = 0.1)))