6

I would like to create an image to compare the difference between the gaussian distribution and the Student's t distribution for small n values.

From my searches in SE I took the definition of the gaussian pdf from Bell Curve/Gaussian Function/Normal Distribution in TikZ/PGF and the example to plot the t distribution from Student t-distribution with TikZ. In the latter, the functions "gamma" and "student" are declared locally. I intend to use this function a few times, so I would like to declare the functions globally. As you can see in the MWE, I tried to do this by using the functions from the tixzpicture declaration and copied them with minor modifications (variables) into the \pgfmathdeclarefunction command copied from the gaussian distribution.

However, if I comile the MWE using the tikzpicture declaration everything is fine, if I uncomment the functions in the preamble and commend the tikzpicture declaration I get no image at all.

My code:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}

\pgfmathdeclarefunction{gauss}{3}{%
  \pgfmathparse{1/(#3*sqrt(2*pi))*exp(-((#1-#2)^2)/(2*#3^2))}%
}

%\pgfmathdeclarefunction{gamma}{1}{%
%   \pgfmathparse{2.506628274631*sqrt(1/#1)+ 0.20888568*(1/#1)^(1.5)+ 0.00870357*(1/#1)^(2.5)- (174.2106599*(1/#1)^(3.5))/25920- (715.6423511*(1/#1)^(4.5))/1244160)*exp((-ln(1/#1)-1)*#1}
%}
%
%\pgfmathdeclarefunction{student}{2}{%
%   \pgfmathparse{gamma((#2+1)/2.)/(sqrt(#2*pi) *gamma(#2/2.)) *((1+(#1*#1)/#2)^(-(#2+1)/2.))}
%}

\begin{document}

\begin{tikzpicture}[
    declare function={gamma(\z)=
    2.506628274631*sqrt(1/\z)+ 0.20888568*(1/\z)^(1.5)+ 0.00870357*(1/\z)^(2.5)- (174.2106599*(1/\z)^(3.5))/25920- (715.6423511*(1/\z)^(4.5))/1244160)*exp((-ln(1/\z)-1)*\z;},
    declare function={student(\x,\n)= gamma((\n+1)/2.)/(sqrt(\n*pi) *gamma(\n/2.)) *((1+(\x*\x)/\n)^(-(\n+1)/2.));}
]

\begin{axis}[
    axis lines=left,
    enlargelimits=upper,
    samples=50,
]
\addplot [thick, smooth, domain=-6:6] {student(x,5)};
\addplot [thick, smooth, domain=-6:6] {gauss(x,0,1)};
\end{axis}
\end{tikzpicture}
\end{document} 

Any hint about what happens here would be fine...

12

I don't know how to properly use \pgfmathdeclarefunction, but for me the following works:

\tikzset{declare function={bellshape(\x,\mu,\sigma)=exp(-(\x-\mu)^2/(2*\sigma^2));}}
\tikzset{declare function={normal(\x,\mu,\sigma)=1/(2.5066283*\sigma)*bellshape(\x,\mu,\sigma);}}
\tikzset{declare function={gamma(\z)= (2.506628274631*sqrt(1/\z) + 0.20888568*(1/\z)^(1.5) + 0.00870357*(1/\z)^(2.5) - (174.2106599*(1/\z)^(3.5))/25920 - (715.6423511*(1/\z)^(4.5))/1244160)*exp((-ln(1/\z)-1)*\z);}}
\tikzset{declare function={tpdf(\x,\nu) = gamma(0.5*(\nu+1))/(sqrt(3.1415927*\nu)*gamma(\nu/2))*(1+\x^2/\nu)^(-(\nu+1)/2);}}

Basically, with \tikzset you can set the same options globally that you would otherwise set locally in square brackets.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.