Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.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积分:视图向量参数_R_Integrate - Fatal编程技术网

R积分:视图向量参数

R积分:视图向量参数,r,integrate,R,Integrate,有没有一种方法可以看到向量R通过积分函数赋值来计算被积函数?也就是说,integrate的形式如下: 集成,下,上 其中函数f必须作用于某个向量,比如x。就是 我不确定这是否是一个最小的可重复的例子。如果要查看向量x,可以在函数开头打印它。或者,您可以设置optionError=recover以在出现错误时输入调试器。你的问题是,在某一点上,所有的低值都是0,当你使用func_mu_grid[ifelselow==0,NA,low]对于所有NAs,您得到的是lengthfunc_mu_grid,

有没有一种方法可以看到向量R通过积分函数赋值来计算被积函数?也就是说,integrate的形式如下:

集成,下,上

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


我不确定这是否是一个最小的可重复的例子。如果要查看向量x,可以在函数开头打印它。或者,您可以设置optionError=recover以在出现错误时输入调试器。你的问题是,在某一点上,所有的低值都是0,当你使用func_mu_grid[ifelselow==0,NA,low]对于所有NAs,您得到的是lengthfunc_mu_grid,而不是您预期的引发警告的lengthlow。问题的第一部分询问R函数integrate如何构造其“x”,为此,您需要查看源代码。一个32位的整数被传递给wk@MrFlick,谢谢-这似乎是问题的核心。值得一提的是,我设置了optionError=recover,但事实上,printx更能直接看到这一点。我相信解决这个问题可以解决我的问题。
    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)
    #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)]