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[(x_i-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:
$\int_{-\infty}^{+\infty}{\sum_{i=1}^{N} K[(x_i-u)/h]*y_i}^2 du$
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;