有没有办法看到向量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,这是警告消息出现的地方。