R integration:视图矢量参数

时间:2014-08-19 17:45:35

标签: r integrate

有没有办法看到向量R分配积分函数来评估被积函数?也就是说,整合的形式如下:

整合(f,lower,upper,...)

其中函数f必须作用于某个向量,比如x。也就是说,

f< - function(x,...){}

当在函数f上使用积分时,有没有办法查看R指定的向量x来评估被积函数?

为了使这个问题更具体,我将在下面介绍这个问题的具体实例。在R中使用集成功能时,我收到以下警告消息:

    Warning messages:
    1: In mean_v_tmp - func_mu_grid[ifelse(low == 0, NA, low)] : 
        longer object length is not a multiple of shorter object length

虽然这是一个简单的警告消息,即两个向量的长度不同(或正确),但这里的问题实际上与集成函数有关。

警告最好在上下文中理解,因此相关代码粘贴在此处,讨论将在下面继续:

    #Define parameters.
    curr_mean_v = -14; curr_sigma_v= 0.1; sigma_epsilon= 2; 
    mu_grid = seq(-14, 18, by=0.5); 
    sigma_grid = seq(0.01, 4, by=0.2);
    STATES_t <- expand.grid(mu_grid, sigma_grid, 2);
    V = rep(0.01, 1300);

    #Stop on warnings.
    options(warn=2)

    #Define function for the integrand when calculating the expected value to go. 
    integrandFunc_V <- function(x, func_mean_v, func_sigma_v, func_sigma_epsilon, func_V, func_STATES, func_mu_grid, func_sigma_grid) {

        #Update the values of mean_v and sigma_v.
        mean_v_tmp <- (func_mean_v/func_sigma_v^2 + x/func_sigma_epsilon^2) / (1/func_sigma_v^2 + 1/func_sigma_epsilon^2);
        sigma_v_tmp <- 1/(1/func_sigma_v^2 + 1/func_sigma_epsilon^2);

        #Round mean_v_tmp to values on mean_grid. 
        low <- findInterval(mean_v_tmp, func_mu_grid)   #find index of number just below
        high <- low + 1 #find the corresponding index just above
        #Find the absolute difference between the grid number above and below.
        low.diff <- mean_v_tmp-func_mu_grid[ifelse(low==0,NA,low)]
        high.diff <- func_mu_grid[ifelse(high==0,NA,high)]-mean_v_tmp
        mins <- pmin(low.diff,high.diff,na.rm=T)    #find the minimum difference
        pick <- ifelse(!is.na(low.diff) & mins==low.diff, low, high)
        mean_v_tmp <- func_mu_grid[pick]

        #Round sigma_v_tmp to values on sigma_grid.
        low <- findInterval(sigma_v_tmp, func_sigma_grid)   #find index of number just below
        high <- low + 1 #find the corresponding index just above
        #Find the absolute difference between the grid number above and below.
        low.diff <- sigma_v_tmp-func_sigma_grid[ifelse(low==0,NA,low)]
        high.diff <- func_sigma_grid[ifelse(high==0,NA,high)]-sigma_v_tmp
        mins <- pmin(low.diff,high.diff,na.rm=T)    #find the minimum difference
        pick <- ifelse(!is.na(low.diff) & mins==low.diff, low, high)
        sigma_v_tmp <- func_sigma_grid[pick]

        #Collect the value function values associated with mean_v_tmp and sigma_v_tmp. 
        ind_vec <- rep(NA,length(x));
        for (i in 1:length(x)) {
            ind_vec[i] <- intersect(which(abs(func_STATES[,1] - mean_v_tmp[i]) < .0001), which(abs(func_STATES[,2] - sigma_v_tmp) < .0001));    
        } #end i for loop
        Val_tmp <- func_V[ind_vec];
        f <- dnorm(x, func_mean_v, sqrt(func_sigma_v^2 + func_sigma_epsilon^2));
        output <- Val_tmp * f;
        output
    }

    #Integrate the function. 
    integrate(integrandFunc_V, lower=-Inf, upper=Inf, subdivisions=2000, rel.tol= .Machine$double.eps^0.15, func_mean_v= curr_mean_v, func_sigma_v= curr_sigma_v, func_sigma_epsilon= sigma_epsilon, func_V = V, func_STATES = STATES_t, func_mu_grid = mu_grid, func_sigma_grid = sigma_grid)

我的integrandFunc_V函数接受向量x并对其进行操作,为集成函数准备被积函数。有没有办法打印并看到这个向量x,集成函数用来评估被积函数?

如果我创建自己的这样的x向量并在没有集成函数的情况下逐步运行代码,则不会出现警告,并且向量的长度都相同。例如,以下计算low.diff而不发生事故:

    #Define parameters.
    x <- c(-.Machine$double.xmax, -10^10, 0, 10^10,.Machine$double.xmax);
    func_mean_v = -14; func_sigma_v= 0.1; func_sigma_epsilon= 2; 
    func_mu_grid = seq(-14, 18, by=0.5); 
    func_sigma_grid = seq(0.01, 4, by=0.2);

    #Update the values of mean_v and sigma_v.
    mean_v_tmp <- (func_mean_v/func_sigma_v^2 + x/func_sigma_epsilon^2) / (1/func_sigma_v^2 + 1/func_sigma_epsilon^2);
    sigma_v_tmp <- 1/(1/func_sigma_v^2 + 1/func_sigma_epsilon^2);

    #Round mean_v_tmp to values on mean_grid. 
    low <- findInterval(mean_v_tmp, func_mu_grid)   #find index of number just below
    high <- low + 1 #find the corresponding index just above            #Find the absolute difference between the grid number above and below.
    low.diff <- mean_v_tmp-func_mu_grid[ifelse(low==0,NA,low)]

因此,我的代码和R集成函数使用的x向量必定存在一些问题。有没有办法查看这个载体?

最后,我会注意到,如果V = rep(0,1300),则不会出现警告消息,代码正常。但是,如果V非零,则出现上述问题。这尤其奇怪,因为V不需要计算low.diff,这是警告消息出现的地方。

0 个答案:

没有答案