/* <html><head>Baseball example from Section 8.3 and Chapter 8, Exercise 4 </head><body><pre>
 */

#include &ltiostream&gt
#include &ltiomanip&gt
#include &ltfstream&gt
#include &ltcmath&gt
using namespace std;

ofstream ans("baseball.ans");

const int r=18;      /* Number of players        */
const int n=45;      /* Number of times at bat   */

int main (void)
{
  ans.setf(ios::showpoint);
  int i;
  double Xbar,Ybar,S,lambda,MSP,MSE,MSEEfron,MSPEfron,Eff,EffP,
         P0,S1,Mu,lambda1,MSP1,MSE1,MSEStein,MSPStein,Eff1,EffP1;
  double Y[r],X[r],P[r],Ave[r],ML[r],Theta[r],Efron[r],
         RetransEfron[r],Stein[r],RetransStein[r];
  int M[r]={
    18,17,16,15,14,14,13,12,11,11,10,10,10,10,10,9,8,7
    };
  int Atbats[r]={
    367,426,521,275,418,466,586,138,510,
    200,277,270,435,538,186,558,408, 70
    };
  int Hits[r]={
    127,127,144, 61,114,126,154, 29,137,
     46, 73, 69,132,142, 42,159,129, 14
    };
  char Name[r][12]={
    "Clemente","F Robinson","F Howard", "Johnstone", "Berry",
    "Spencer", "Kessinger", "L Alvardo","Santo",     "Swoboda",
    "Unser",   "Williams",  "Scott",    "Petrocelli","E Rodriguez",
    "Campaneris","Munson","Alvis"
    };
  char Team[r][6]={
    "Pitts","Balt","Wash","Cal","Chi","Cal","Chi","Bos","Chi",
    "NY","Wash","Chi","Bos","Bos","KC","Oak","NY","Mil"
    };
  char League [r][3]={
    "NL","AL","AL","AL","AL","AL","NL","AL","NL",
    "AL","AL","AL","AL","AL","AL","AL","AL","NL"
    };
  Xbar=Ybar=MSE=MSP=0;
  for (i=0; i < r; i++)
  {
    Y[i]=double(M[i])/double(n);
    X[i]=2*sqrt(double(n))*asin(sqrt(Y[i]));
    Xbar+=X[i]/r;
    Ybar+=Y[i]/r;
    P[i]=double(Hits[i])/double(Atbats[i]);
    Theta[i]=2*sqrt(double(n))*asin(sqrt(P[i]));
    MSE+=(X[i]-Theta[i])*(X[i]-Theta[i])/r;
    MSP+=(Y[i]-P[i])*(Y[i]-P[i])/r;
  };
  S=0;
  for (i=0; i < r; i++)
    S+=(X[i]-Xbar)*(X[i]-Xbar);
  lambda=(r-3)/S;
  ans << " i Name        Team  League Y     P     "
      << "Atbats X     Theta" << endl;
  for (i=0; i < r; i++)
  {
    ans << setw(2) << i+1 << " ";
    ans.setf(ios::left);
    ans << setw(12) << Name[i] << setw(6) << Team[i]
        << setw(3) << League[i] << "    ";
    ans.setf(ios::right);
    ans << setw(6) << setprecision(3) << Y[i]
        << setw(6) << P[i]
        << setw(3) << Atbats[i] << "    "
        << setw(6) << setprecision(4) << X[i]
        << setw(6) << Theta[i] << endl;
  }
  ans << endl;
  MSEEfron=MSPEfron=0;
  for (i=0; i < r; i++)
  {
    Ave[i]=P[i];
    ML[i]=Y[i];
    Efron[i]=lambda*Xbar+(1-lambda)*X[i];
    RetransEfron[i]=sin(Efron[i]/(2*sqrt(double(n))))*
                    sin(Efron[i]/(2*sqrt(double(n))));
    MSEEfron+=(Efron[i]-Theta[i])*(Efron[i]-Theta[i])/r;
    MSPEfron+=(RetransEfron[i]-P[i])*(RetransEfron[i]-P[i])/r;
  }
  Eff=MSE/MSEEfron;
  EffP=MSP/MSPEfron;
  ans << " i Name        Team  League Ave   ML    RetransEfron"
      << endl;
  for (i=0; i < r; i++)
  {
    ans << setw(2) << i+1 << " ";
    ans.setf(ios::left);
    ans << setw(12) << Name[i] << setw(6)
        << Team[i]
        << setw(3) << League[i] << "    ";
    ans.setf(ios::right);
    ans << setw(6) << setprecision(3) << Ave[i] << setw(6)
        << ML[i] << setw(3) << RetransEfron[i] << endl;
  }
  ans << endl;
  ans << "Ybar     Xbar    S       lambda" << endl;
  ans << Ybar << "   " << Xbar << "   " << S
      << "   " << lambda << endl;
  ans << endl;
  ans << "MSE     MSEEfron   Eff      MSP       "
      << "MSPEfron   EffP" << endl;
  ans << setw(7) << setprecision(4) << MSE << " " << MSEEfron
      << "     " << Eff << "    " << setw(8) << MSP
      << "  " << MSPEfron << "   " << EffP << endl;
  ans << endl;
  /* Remainder of program concerns Chapter 8, Question 4 */
  P0=0.25;
  Mu=2*sqrt(double(n))*asin(sqrt(P0));
  S1=0;
  for (i=0; i < r; i++)
    S1+=(X[i]-Mu)*(X[i]-Mu);
  lambda1=(r-2)/S1;
  MSEEfron=MSPEfron=0;
  MSEStein=MSPStein=0;
  for (i=0; i < r; i++)
  {
    Stein[i]=lambda1*Mu+(1-lambda1)*X[i];
    RetransStein[i]=sin(Stein[i]/(2*sqrt(double(n))))*
                    sin(Stein[i]/(2*sqrt(double(n))));
    MSEStein+=(Stein[i]-Theta[i])*(Stein[i]-Theta[i])/r;
    MSPStein+=(RetransStein[i]-P[i])*(RetransStein[i]-P[i])/r;
  }
  Eff1=MSE/MSEStein;
  EffP1=MSP/MSPStein;
  ans << " i Name        Team  League Ave   ML    RetransStein"
      << endl;
  for (i=0; i < r; i++)
  {
    ans << setw(2) << i+1 << " ";
    ans.setf(ios::left);
    ans << setw(12) << Name[i] << setw(6)
        << Team[i]
        << setw(3) << League[i] << "    ";
    ans.setf(ios::right);
    ans << setw(6) << setprecision(3) << Ave[i] << setw(6)
        << ML[i] << setw(3) << RetransStein[i] << endl;
  }
  ans << endl;
  ans << "Ybar     Xbar    S1      lambda1" << endl;
  ans << Ybar << "   " << Xbar << "   " << S1
      << "   " << lambda1 << endl;
  ans << endl;
  ans << "MSE     MSEStein    Eff1     MSP       "
      << "MSPStein   EffP1" << endl;
  ans << setw(7) << setprecision(4) << MSE << " " << MSEStein
      << "      " << Eff1 << "    " << setw(8) << MSP
      << "  " << MSPStein << "   " << EffP1 << endl;
}
  
/* </pre></body></html> */
