使用 r 中的 for 循环将最佳函数应用于函数
apply an optimal function to a function using a for loop in r
我为最大似然写了一个简单的函数,并希望这个函数使用 R 中的 for
循环根据其参数的不同值给出不同的结果。那是我的函数包括一个基于 for
循环。我的功能运行良好,结果保存在列表中。然后,由于我有两个不同的结果,我想根据函数的每个部分将 optim
函数应用于我的函数。例如,
ff <- function(x,mu=c(2,0.5),sd=c(0.2,0.3)){
out <- vector("list",2)
for (i in 1:2){
out[[i]] <- -sum(log(dnorm(x,mu[[i]],sd[[i]]))) ## here I have two different part of my funcitons wrap as one using for loop.
}
return(out)
}
set.seed(123)
x <- rnorm(10,2,0.5)
x
那么我函数的结果是:
> ff(x)
[[1]]
[1] 25.33975
[[2]]
[1] 101.4637
然后,由于我的函数有两个不同的部分使用 for
循环包装成一个,我想根据它的每个部分将 optim 函数应用于此函数。我尝试了很多自己的方法,但都没有用。这是我的尝试之一:
op <- vector("list",2)
for(i in 1:2){
op <- optim(c(0.5,0.5),fn=ff[[i]],i=i)
}
也就是说,我希望 optim
函数在我的参数 i=1
的第一个值处计算我的函数,然后在第二个 i=2
处计算函数。
所以我没有包装的功能如下:
ff_1 <- function(x,mu=c(2,0.5),sd=c(0.2,0.3)){
-sum(log(dnorm(x,mu[[1]],sd[[1]])))
return(out)
}
ff_2 <- function(x,mu=c(2,0.5),sd=c(0.2,0.3)){
-sum(log(dnorm(x,mu[[2]],sd[[2]])))
return(out)
}
然后我需要为每个函数使用两个不同的 optim
函数。
我搜索了很多网站和 R 帮助网站,但找不到这个问题的解决方案。
有什么帮助吗?
试试这个,我想这只是将参数传递给 optim 的方式
# given data
set.seed(123)
x <- rnorm(10,2,0.5)
# use vector parOpt instead of specifying two; for convience
# with optim
ff <- function(x, parOpt){
out <- -sum(log(dnorm(x, parOpt[1], parOpt[2])))
return(out)
}
# parameters in mu,sd vectors arranged in list
params <- list(set1 = c(2, 0.2), set2 = c(0.5, 0.3))
# output list
out <- list()
for(i in 1:2){
# pass params (mu and sd) to optim, function ff and the data
# note, since function ff has x argument, specify that in optim
out[[i]] <- optim(par = params[[i]], fn=ff ,x=x)
}
应该给出这样的东西:
[[1]]
[[1]]$par
[1] 2.0372546 0.4523918
[[1]]$value
[1] 6.257931
[[1]]$counts
function gradient
55 NA
[[1]]$convergence
[1] 0
[[1]]$message
NULL
[[2]]
[[2]]$par
[1] 2.037165 0.452433
[[2]]$value
[1] 6.257932
[[2]]$counts
function gradient
73 NA
[[2]]$convergence
[1] 0
[[2]]$message
NULL
希望对您有所帮助。
作为替代方案,您可以使用 fitdistrplus
软件包的命令 fitdist
找到相同的解决方案:
library(fitdistrplus)
set.seed(123)
x <- rnorm(10,2,0.5)
mu.start <- c(2,0.5)
sd.start <- c(0.2,0.3)
op <- vector("list",2)
for(i in 1:2){
op[[i]] <- fitdist(x,"norm", start=c(mu.start[i],sd.start[i]))
}
op
结果是:
[[1]]
Fitting of the distribution ' norm ' by maximum likelihood
Parameters:
estimate Std. Error
1 2.0372546 0.1430588
2 0.4523918 0.1011464
[[2]]
Fitting of the distribution ' norm ' by maximum likelihood
Parameters:
estimate Std. Error
1 2.037165 0.1430719
2 0.452433 0.1011694
我为最大似然写了一个简单的函数,并希望这个函数使用 R 中的 for
循环根据其参数的不同值给出不同的结果。那是我的函数包括一个基于 for
循环。我的功能运行良好,结果保存在列表中。然后,由于我有两个不同的结果,我想根据函数的每个部分将 optim
函数应用于我的函数。例如,
ff <- function(x,mu=c(2,0.5),sd=c(0.2,0.3)){
out <- vector("list",2)
for (i in 1:2){
out[[i]] <- -sum(log(dnorm(x,mu[[i]],sd[[i]]))) ## here I have two different part of my funcitons wrap as one using for loop.
}
return(out)
}
set.seed(123)
x <- rnorm(10,2,0.5)
x
那么我函数的结果是:
> ff(x)
[[1]]
[1] 25.33975
[[2]]
[1] 101.4637
然后,由于我的函数有两个不同的部分使用 for
循环包装成一个,我想根据它的每个部分将 optim 函数应用于此函数。我尝试了很多自己的方法,但都没有用。这是我的尝试之一:
op <- vector("list",2)
for(i in 1:2){
op <- optim(c(0.5,0.5),fn=ff[[i]],i=i)
}
也就是说,我希望 optim
函数在我的参数 i=1
的第一个值处计算我的函数,然后在第二个 i=2
处计算函数。
所以我没有包装的功能如下:
ff_1 <- function(x,mu=c(2,0.5),sd=c(0.2,0.3)){
-sum(log(dnorm(x,mu[[1]],sd[[1]])))
return(out)
}
ff_2 <- function(x,mu=c(2,0.5),sd=c(0.2,0.3)){
-sum(log(dnorm(x,mu[[2]],sd[[2]])))
return(out)
}
然后我需要为每个函数使用两个不同的 optim
函数。
我搜索了很多网站和 R 帮助网站,但找不到这个问题的解决方案。
有什么帮助吗?
试试这个,我想这只是将参数传递给 optim 的方式
# given data
set.seed(123)
x <- rnorm(10,2,0.5)
# use vector parOpt instead of specifying two; for convience
# with optim
ff <- function(x, parOpt){
out <- -sum(log(dnorm(x, parOpt[1], parOpt[2])))
return(out)
}
# parameters in mu,sd vectors arranged in list
params <- list(set1 = c(2, 0.2), set2 = c(0.5, 0.3))
# output list
out <- list()
for(i in 1:2){
# pass params (mu and sd) to optim, function ff and the data
# note, since function ff has x argument, specify that in optim
out[[i]] <- optim(par = params[[i]], fn=ff ,x=x)
}
应该给出这样的东西:
[[1]]
[[1]]$par
[1] 2.0372546 0.4523918
[[1]]$value
[1] 6.257931
[[1]]$counts
function gradient
55 NA
[[1]]$convergence
[1] 0
[[1]]$message
NULL
[[2]]
[[2]]$par
[1] 2.037165 0.452433
[[2]]$value
[1] 6.257932
[[2]]$counts
function gradient
73 NA
[[2]]$convergence
[1] 0
[[2]]$message
NULL
希望对您有所帮助。
作为替代方案,您可以使用 fitdistrplus
软件包的命令 fitdist
找到相同的解决方案:
library(fitdistrplus)
set.seed(123)
x <- rnorm(10,2,0.5)
mu.start <- c(2,0.5)
sd.start <- c(0.2,0.3)
op <- vector("list",2)
for(i in 1:2){
op[[i]] <- fitdist(x,"norm", start=c(mu.start[i],sd.start[i]))
}
op
结果是:
[[1]]
Fitting of the distribution ' norm ' by maximum likelihood
Parameters:
estimate Std. Error
1 2.0372546 0.1430588
2 0.4523918 0.1011464
[[2]]
Fitting of the distribution ' norm ' by maximum likelihood
Parameters:
estimate Std. Error
1 2.037165 0.1430719
2 0.452433 0.1011694