I would like to take an integral where the main function contains data (x_i,y_i)
. The length of the data is N
. The integrand is the (summation of kernel times y_i)^2
. The kernel function is denoted by K[(xi−u)/h] which is the kernel of standard Normal, and h
is the known bandwidth, 0.3 (say).
We need to take the integral over u
and the bounds of integral are -infinity
and +infinity
. The form of integration is as follows:
∫+∞−∞∑Ni=1K[(xi−u)/h]∗yi2du
I do not know how to code this in GAUSS. Any guidance would be appreciated.
I can also put a simple data for (x_i,y_i)
here:
Xk Yk 0.2841436 -0.08043074 1.2426602 -0.25865713 -0.2392296 -0.82383213
The standard Normal kernel is as follows:
fn gauss(r) = 1/(2*sqrt(pi)).*exp(-(r^2)/2);
3 Answers
0
accepted
There are two things that need to change in your code:
- Your first input to
integrate1d
is not correct. It needs to be a pointer to a procedure and can be made like this:
Answer = integrate1d(&integrand, __INFN, __INFp, yd,xd,thetaNd,hpower);
or this:
// Create pointer to procedure 'integrand' integ = &integrand; Answer = integrate1d(integ, __INFN, __INFp, yd,xd,thetaNd,hpower);
- To create a vector of results, you need to first create a vector that is the size of your final output. The 'zeros' function is a good option for this.
Here is the full code with these changes:
// Minimization Alg. to find theta_hat proc ( 1 ) = QNminimize(y,x); local n,thetaN; n = rows(y); thetaN = sumc(y .* exp(x) ./ (1+exp(x)))/sumc((exp(x) ./ (1+exp(x)))^2); retp(thetaN); endp; // TN_integral value proc ( 1 ) = integrand(u,y,x,thetaN,hpower); local n,gam,arg,ker,gxtheta,T_N,T_Ninteg; n = rows(y); gam = 1/n^hpower; arg = (x-u)/gam; ker = pdfn(arg); gxtheta = thetaN*exp(x) ./ (1+exp(x)); T_N = ker .* (y-gxtheta); T_Ninteg = sumc(T_N)^2 * exp(-u^2/2); retp(T_Ninteg); endp; /* main program */ library gauss, pgraph; pqgwin many; seed1 = 123; iter = 500; @ # iterations @ nn = 100; @ sample size selections @ hpower = 1/3; @ value of bandwidth @ // Pre-allocate vector to hold the results Answer = zeros(iter, 1); k = 1; do until k > iter; @ loop for simulation @ xd = rndns(nn,1,seed1); yd = rndns(nn,1,seed1); // minimization thetaNd = QNminimize(yd,xd); // Integrand Answer[k] = integrate1d(&integrand, __INFN, __INFp, yd,xd,thetaNd,hpower); k = k+1; endo;
0
I'm not sure if this is exactly what you want, but it should show you the things you need to know to make it work:
X = { 0.2841436, 1.2426602, -0.2392296 }; Y = { -0.08043074, -0.25865713, -0.82383213 }; /* ** Integrate the procedure 'kernel' from negative to positive infinity ** __INFN is negative infinity and __INFP is positive infinity */ area = integrate1d(&kernel, __INFN, __INFp, X, Y); proc (1) = kernel(u, X, Y); local result; result = sumc(pdfn(X - u) .* Y.^2); retp(result); endp;
0
Thank you for the response. It was very helpful!
I also have an additional question. How can I use this integral inside of a loop where X and Y are different per each iteration.
I know that I should put the proc(1)=kernel(u,X,Y)
outside of the loop. Then, how can I put the line called "area" inside of the loop that it could be used for different data set? Please see the small example below, where I have a bit complicated case with minimization step and an additional function inside of "integrand" rather than the kernel function that you used above.
From this example, I need to have 500 Answers of Integrals as output. Thanks in advance for the help!
// Minimization Alg. to find theta_hat proc ( 1 ) = QNminimize(y,x); local n,thetaN; n = rows(y); thetaN = sumc(y .* exp(x) ./ (1+exp(x)))/sumc((exp(x) ./ (1+exp(x)))^2); retp(thetaN); endp; // TN_integral value proc ( 1 ) = integrand(u,y,x,thetaN,hpower); local n,gam,arg,ker,gxtheta,T_N,T_Ninteg; n = rows(y); gam = 1/n^hpower; arg = (x-u)/gam; ker = pdfn(arg); gxtheta = thetaN*exp(x) ./ (1+exp(x)); T_N = ker .* (y-gxtheta); T_Ninteg = sumc(T_N)^2 * exp(-u^2/2); retp(T_Ninteg); endp; /* main program */ library gauss, pgraph; pqgwin many; seed1 = 123; iter = 500; @ # iterations @ nn = 100; @ sample size selections @ hpower = 1/3; @ value of bandwidth @ k = 1; do until k > iter; @ loop for simulation @ xd = rndns(nn,1,seed1); yd = rndns(nn,1,seed1); //minimization thetaNd = QNminimize(yd,xd); //Integrand Integ = integrand(u,yd,xd,thetaNd,hpower); Answer = integrate1d(&Integ, __INFN, __INFp, yd,xd,thetaNd,hpower); k = k+1; endo;
Your Answer
3 Answers
There are two things that need to change in your code:
- Your first input to
integrate1d
is not correct. It needs to be a pointer to a procedure and can be made like this:
Answer = integrate1d(&integrand, __INFN, __INFp, yd,xd,thetaNd,hpower);
or this:
// Create pointer to procedure 'integrand' integ = &integrand; Answer = integrate1d(integ, __INFN, __INFp, yd,xd,thetaNd,hpower);
- To create a vector of results, you need to first create a vector that is the size of your final output. The 'zeros' function is a good option for this.
Here is the full code with these changes:
// Minimization Alg. to find theta_hat proc ( 1 ) = QNminimize(y,x); local n,thetaN; n = rows(y); thetaN = sumc(y .* exp(x) ./ (1+exp(x)))/sumc((exp(x) ./ (1+exp(x)))^2); retp(thetaN); endp; // TN_integral value proc ( 1 ) = integrand(u,y,x,thetaN,hpower); local n,gam,arg,ker,gxtheta,T_N,T_Ninteg; n = rows(y); gam = 1/n^hpower; arg = (x-u)/gam; ker = pdfn(arg); gxtheta = thetaN*exp(x) ./ (1+exp(x)); T_N = ker .* (y-gxtheta); T_Ninteg = sumc(T_N)^2 * exp(-u^2/2); retp(T_Ninteg); endp; /* main program */ library gauss, pgraph; pqgwin many; seed1 = 123; iter = 500; @ # iterations @ nn = 100; @ sample size selections @ hpower = 1/3; @ value of bandwidth @ // Pre-allocate vector to hold the results Answer = zeros(iter, 1); k = 1; do until k > iter; @ loop for simulation @ xd = rndns(nn,1,seed1); yd = rndns(nn,1,seed1); // minimization thetaNd = QNminimize(yd,xd); // Integrand Answer[k] = integrate1d(&integrand, __INFN, __INFp, yd,xd,thetaNd,hpower); k = k+1; endo;
I'm not sure if this is exactly what you want, but it should show you the things you need to know to make it work:
X = { 0.2841436, 1.2426602, -0.2392296 }; Y = { -0.08043074, -0.25865713, -0.82383213 }; /* ** Integrate the procedure 'kernel' from negative to positive infinity ** __INFN is negative infinity and __INFP is positive infinity */ area = integrate1d(&kernel, __INFN, __INFp, X, Y); proc (1) = kernel(u, X, Y); local result; result = sumc(pdfn(X - u) .* Y.^2); retp(result); endp;
Thank you for the response. It was very helpful!
I also have an additional question. How can I use this integral inside of a loop where X and Y are different per each iteration.
I know that I should put the proc(1)=kernel(u,X,Y)
outside of the loop. Then, how can I put the line called "area" inside of the loop that it could be used for different data set? Please see the small example below, where I have a bit complicated case with minimization step and an additional function inside of "integrand" rather than the kernel function that you used above.
From this example, I need to have 500 Answers of Integrals as output. Thanks in advance for the help!
// Minimization Alg. to find theta_hat proc ( 1 ) = QNminimize(y,x); local n,thetaN; n = rows(y); thetaN = sumc(y .* exp(x) ./ (1+exp(x)))/sumc((exp(x) ./ (1+exp(x)))^2); retp(thetaN); endp; // TN_integral value proc ( 1 ) = integrand(u,y,x,thetaN,hpower); local n,gam,arg,ker,gxtheta,T_N,T_Ninteg; n = rows(y); gam = 1/n^hpower; arg = (x-u)/gam; ker = pdfn(arg); gxtheta = thetaN*exp(x) ./ (1+exp(x)); T_N = ker .* (y-gxtheta); T_Ninteg = sumc(T_N)^2 * exp(-u^2/2); retp(T_Ninteg); endp; /* main program */ library gauss, pgraph; pqgwin many; seed1 = 123; iter = 500; @ # iterations @ nn = 100; @ sample size selections @ hpower = 1/3; @ value of bandwidth @ k = 1; do until k > iter; @ loop for simulation @ xd = rndns(nn,1,seed1); yd = rndns(nn,1,seed1); //minimization thetaNd = QNminimize(yd,xd); //Integrand Integ = integrand(u,yd,xd,thetaNd,hpower); Answer = integrate1d(&Integ, __INFN, __INFp, yd,xd,thetaNd,hpower); k = k+1; endo;