Matlab - Data Envelopment Analysys (duda con la sintaxis)

 
Vista:

Data Envelopment Analysys (duda con la sintaxis)

Publicado por Juan Gomez (1 intervención) el 27/06/2014 20:03:30
¡¡Hola!!
Estoy trabajando con indicadores compuestos y necesito utilizar DEA (Data Envelopment Analysis) para obtener puntuaciones por países en las diferentes dimensiones estudiadas. Este que aparece abajo es el script que me proponen. Sin embargo, debo estar haciendo algo mal porque no me sale el output. Lo que hago es que en la ventana de comandos (y una vez instalados los scripts, el que se adjunta y los que se mencionan), introduzco los datos (Y= [1,2,3; 3, 4,5; 4,3,4] (por ejemplo).
Después, escribo:
DEApieshares_classical_median (Y, 0.3, 0.7, 0)

Por un ejemplo que he consultado, entiendo que la suma de L y U (en el script) debe dar 1. El 0 entiendo que es para obtener datos de la diagonal. Éste es el error que me aparece:

??? Error using ==> minus
Matrix dimensions must agree.

Error in ==> DEApieshares_classical_median at 27
A = [Y; diag(Y(j,:)) - U'*Y(j,:); -diag(Y(j,:)) + L'*Y(j,:)];

Soy sociólogo y no he utilizado nunca este programa salvo para la imputacíon de los "missing values" con un script que no me dio el más mínimo problema. Sin embargo aquí estoy atascado y no sé por donde tirar. Os agradecería mucho si me podéis echar una mano.

function [w,si,ss]=DEApieshares_classical_median(Y, L, U, k)
% This routine calculates both the classical and the median DEA scores
% using a matlab linear programming function ("linprog.m", "lipsol.m")).
%
% Function to be maximised: si(k) = max w(k,:) * X(k,:)'
% Constraints:
% 1. Y * w(k,:)' <= 1
% 2. y(k,i)*w(k,i) / y(k,:)'*w(k,:) >= L(i)
% 3. y(k,i)*w(k,i) / y(k,:)'*w(k,:) <= U(i)
% 4. w(k,i) >= 0
% 5. y(k_j,i)*w(k_j,i) <= y(l,i)*w(l,i), j = 1,2, l<>k_j
% Legend:
% Y = input data (rows: countries, columns: indicators, m x n)
% U and L are row vectors (pie shares)
% k is a 2-element vector
% OUTPUT
% w = matrix of weights (m x n)
% si = column vector of classical DEA scores (n x 1)
% ss = matrix of scores calculated using all m sets of weights ( m x m)
% Note that the cross-efficiency version of DEA considers the average or
% median (across columns) of the matrix ss.
%----------------------------------------------------------------
[K, I] = size(Y);
if k==0, % if there is no ordinal constraint (n.5 above not included)
for j = 1 :K
j
A = [Y; diag(Y(j,:)) - U'*Y(j,:); -diag(Y(j,:)) + L'*Y(j,:)];
b = [ones(K,1); zeros(2*I,1)];
[ww, z] = linprog(-Y(j,:)', A, b,[],[],zeros(I,1));
w(j,:) = ww';
si(j,:) = -z;
end
else % if there is the ordinal constraint (n.5 above included)
for j = 1 :K
tmp0 = diag(Y(j,:));
tmp1 = [1:I];
tmp2 = ones(I-2,1)*(tmp1==k(1));
tmp3 = ones(I-2,1)*(tmp1==k(2));
tmp4 = find(tmp1~=k(2) & tmp1~=k(1));
tmp5 = tmp0(tmp4,:);
A = [Y; diag(Y(j,:)) - U'*Y(j,:); -diag(Y(j,:)) + L'*Y(j,:); Y(j,k(1))*tmp2 - tmp5; Y(j,k(2))*tmp2 - tmp5];
b = [ones(K,1); zeros(2*I,1); zeros(2*I-4,1)];
[ww, z] = linprog(-Y(j,:)', A, b,[],[],zeros(I,1));
w(j,:) = ww';
si(j,:) = -z;
end
end

% scores based on the m different sets of weights (median DEA could be calculated)
ss=Y*w';


¡¡Muchas gracias!! Un saludo. Juan.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder