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