function kenz(varargin)

if sum(double(size(varargin) ~= [1 4]))
    disp(' ')
    disp('    COMMAND: kenz(data, initialparameters, ''id'', regression)')
    disp(' ')
    disp('    data(:,1) = [substrate]              (M)')
    disp('    data(:,2) = reaction rate            (M/min)')
    disp('    data(1,3) = [enzyme]                 (M)')
    disp('    data(2,3) = temperature              (ºC)')
    disp(' ')
    disp('    initialparameters(1) = k2            (min-1)')
    disp('    initialparameters(2) = Km            (M)')
    disp(' ')
    disp('    id = ''identifying text string''')
    disp(' ')
    disp('    regression = 0 => only plots')
    disp('    regression = 1 => plots and regression')
    disp(' ')
    return
end

X = varargin{1}; beta0 = varargin{2}; id = varargin{3}; regression = varargin{4};

if regression == 1                                                    % regressão não linear
    options = statset('MaxIter',100,'TolX',1e-8,'TolFun',1e-8);
    [beta,r,J,COVB,mse] = nlinfit(X,X(:,2)',@enzing,beta0,options);
    errs95 = [nlparci(real(beta),real(r),'jacobian',real(J)); zeros(2,2)];          % intervalos de incerteza dos parâmetros com 95% de confiança
    [yfit Vline pHline] = enzing(beta,X);
else
    beta = beta0;
    errs95 = zeros(4,2);
    [yfit Vline pHline] = enzing(beta0,X);                            % cálculo da função com valores inicias de parâmetros
end

% estatísticas dos resultados do ajuste
% cc = real(corrcoef([yfit' X(:,2)]));            % coeficiente de correlação NÃO É adequado para regressão não-linear
r = yfit' - X(:,2);                               % resíduos
errs95 = abs((errs95(:,2)-errs95(:,1))/2);
% [hX2 pX2 statsX] = chi2gof(r,'cdf',{@normcdf,0,std(r)});       % estatística de teste chi-quadrado dos resíduos, nível de significância 5%
[htS ptS ci statst] = ttest(r,0);                              % estatística de teste t-Student dos resíduos, nível de significância 5%

% inserir texto gráfico Michaelis-Menten, parâmetros
espa = ['  ';'  ';'  ';'  ';'  '];
col1 = strvcat('parameter','k2','Km','[enzyme]','temperature');
col2 = strvcat('value',num2str([beta(1);beta(2);X(1,3);X(2,3)]));
col3 = strvcat('conf.inter.95%',num2str(errs95));
col4 = strvcat('unit','min-1','M','M','ºC');
A = 'Michaelis-Menten (non-linear regression parameters and errors estimates)';
B = [col1 espa col2 espa col3 espa col4];
texto = strvcat(A,B);
figure(1);
title([id '  ' date]);
% text(mean(X(:,1)),min(X(:,2)),texto,'FontName','Courier New','FontSize',10,'HorizontalAlignment','left');
xlabel('[substrate] (M)');
ylabel('reaction rate (M/min)');
disp(' ');
disp(texto);

% gráficos dos resíduos da regressão e inserção de texto
figure(1)
subplot(2,4,3), normplot(r)
xlabel('residues (M/min)');
ylabel('probability');
subplot(2,4,4), plot(r(1:length(r)-1),r(2:length(r)),'-o')
title('Sequential Self-correlation')
xlabel('residues (M/min)');
ylabel('residues (M/min)');
subplot(2,4,7), plot(X(:,1),r,'-o')
title('Residue Sample');
xlabel('[substrate] (M)');
ylabel('residues (M/min)');
subplot(2,4,8)
plot(1./X(:,1),1./X(:,2),'o')
hold on
cc = corrcoef(1./X(:,1),1./X(:,2));
[p S] = polyfit(1./X(:,1),1./X(:,2),1);
LB = @(x) p(1)*x + p(2);
fplot(LB,[0 1./X(1,1)]);
Rinv = inv(S.R);
CM = (Rinv*Rinv')*S.normr^2/S.df;
SE = diag(sqrt(CM));
tpercentile = tinv(1-(0.5/2),2); % t(1–?/2,n–p), the 100(1–?/2) percentile of t-distribution with n – p degrees of freedom
CI = SE * tpercentile;
xlabel('1/[substrate] (1/M)');
ylabel('1/v (min/M)');
title('Lineweaver-Burk');
espa = ['  ';'  ';'  '];
col1 = strvcat('parameter','slope','intercept');
col2 = strvcat('value',num2str(p(1)),num2str(p(2)));
col3 = strvcat('conf.inter.95%',num2str(CI(1)),num2str(CI(2)));
col4 = strvcat('unit','min','min/M');
A = 'Lineweaver-Burk (linear correlation, parameters and errors estimates)';
C = ['correlation coeficient: ' num2str(cc(2,1))];
B = [col1 espa col2 espa col3 espa col4];
texto = strvcat(A,C,B);
% k2 = 1/(p(2)*X(1,3));
% KM = p(1)*k2*X(1,3);
% disp(k2)
% disp(KM)
% text(mean(X(:,1)),min(X(:,2)),texto,'FontName','Courier New','FontSize',10,'HorizontalAlignment','left');


% texto dos resultados, resíduos
D = ['residues average               ' num2str(mean(r)) ' (M/min)'];
E = ['absolute residues average      ' num2str(mean(abs(r))) ' (M/min)'];
F = ['standard error of regression   ' num2str(sqrt(sum(r.*r)/(length(r)-1))) ' (M/min)'];      % para o modelo ajustado é o mesmo que std(r) 
G = ['% positive residues:           ' num2str(100*sum(r > 0)/length(r))];
H = ['% negative residues:           ' num2str(100*sum(r < 0)/length(r))];
I = ['residue sample t-statistic     ' num2str(statst.tstat)];
J = ['p-value for t-statistic        ' num2str(ptS)];
% K = ['chi quadrado para resíduos       ' num2str(statsX.chi2stat)];
% L = ['valor p para chi quadrado        ' num2str(pX2)];
% textor = strvcat(D,E,F,G,H,I,J,K,L);
A = 'Michaelis-Menten (non-linear regression residues statistics)';
B = strvcat(D,E,F,G,H,I,J);
textor = strvcat(A,B);
% text(mean(X(:,1)),mean(r),textor,'FontName','Courier New','FontSize',10,'HorizontalAlignment','left');
disp(' ');
disp(textor);
disp(' ');
disp(texto);
disp(' ');




1==1;


function [v cSline vline] = enzing(par,X)

% CONTÉM FUNÇÃO A AJUSTAR. PRODUZ GRÁFICO COM PONTOS EXPERIMENTAIS E LINHA
% DO AJUSTE PARA VALORES CORRENTES DOS PARÂMETROS

% renomeação de variáveis
cS = X(:,1);                                      % tempo (min)
vexp = X(:,2);                                    % velocidade experimental (M/min de glucose)
cenz = X(1,3);                                    % concentração de enzima (M)
k2 = par(1); Km = par(2);                         % parâmetros

% cálculo de pH estimado para os valores de parâmetros par() e volume V de NaOH adicionado.
% Cálculo da função de ajuste com 200 pontos (pHline).
passo = (max(cS) - 0)/200;
cSline = 0:passo:max(cS);
% cSline = 0:passo:5;
v = [];
vline = [];
cSs = [cS; cSline'];
for ix = 1:length(cSs)
    if ix > length(cS)
        vline = [vline; k2*cenz*cSline(ix-length(cS))/(Km + cSline(ix-length(cS)))];
    else
        v = [v k2*cenz*cS(ix)/(Km + cS(ix))];
    end
1==1;
end
cS = cS';


% gráficos
figure(1); clf;

% gráfico dos dados experimentais e da função a ajustar, para valores de parâmetros correntes
subplot(2,4,[1 2 5 6])
plot(cS,vexp,'or','MarkerFaceColor','r','MarkerSize',8);
hold on
plot(cSline,vline,'-k','LineWidth',2);
% axis([0,max(cSline),0,max(vline)]);


1==1;




