使用r中的for循环将最佳函数应用于函数

时间:2017-04-22 13:45:28

标签: r optimization mathematical-optimization

我为最大似然编写了一个简单的函数,并希望这个函数在R中使用for循环基于其参数的不同值给出不同的结果。这是我的函数包括基于{{1的表达式循环。我的功能运行良好,结果保存在列表中。然后,由于我有两个不同的结果,我想根据函数的每个部分将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 循环换行,我想基于它的每个部分将optim函数应用于此函数。我尝试了很多自己的方法而且没有用。这是我的尝试之一:

for

也就是说,我希望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) } 函数。

我搜索了许多网站和R帮助网站,但我找不到这个问题的解决方案。

请帮忙吗?

2 个答案:

答案 0 :(得分:1)

尝试这个,它只是将参数传递给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

希望这有帮助。

答案 1 :(得分:1)

作为替代方案,您可以使用fitdist包的fitdistrplus命令找到相同的解决方案:

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