如何在第一列中按ID拆分矩阵+为每个id创建关联矩阵?

时间:2013-08-18 04:35:47

标签: matlab matrix

我试图根据其分支机构的市场份额计算两家律师事务所之间的欧几里德距离(目前为止)。

稍后我将计算400家律师事务所样本中两家公司之间的所有可能距离。

简单地说,我有数据,例如:

Firm  Year  Location  Market_share
1     2000     1         0.1
1     2000     2         0.2
1     2000     3         0.5
1     2000     4         0.2
1     2001     1         0.3
1     2001     2         0.0
1     2001     3         0.2 
1     2001     4         0.5
2     2000     1         0.0
2     2000     2         0.4
2     2000     3         0.2
2     2000     4         0.4
2     2001     1         0.1
2     2001     2         0.5
2     2001     3         0.3
1     2001     4         0.1

上述数据将是每家公司的“平衡”面板数据,因此矩阵的大小将是相同的。每家公司将拥有约200个分支机构和35年的分支机构历史。

我希望将这些数据转换为每个公司ID的年份X位置关联矩阵,其中单元格值代表其市场份额。

如:

公司1

            Location 1 Location 2 Location 3 Location 4 
 2000          0.1        0.2       0.5         0.2 
 2001          0.3        0         0.2         0.5

公司2

            Location 1 Location 2 Location 3 Location 4 
 2000          0         0.4        0.2        0.4
 2001          0.1       0.5        0.3        0.1

依旧......

我需要做的是:

  1. 在第一栏
  2. 中按唯一公司ID拆分上述矩阵
  3. 删除包含id info
  4. 的第一列
  5. 使用(稀疏)命令将剩余矩阵转换为X年位置关联矩阵。
  6. 对公司i和公司j的所有可能组合执行欧几里德距离计算。
  7. 我该如何处理?

1 个答案:

答案 0 :(得分:1)

如果您需要数据表示,请按照此处的说明进行操作:

2000 0 0.4 0.2 0.4
2001 0.3 0 0.2 0.5

您所做的工作如下,假设您有一个数据矩阵表示,其中包含您显示的行和列表示,并命名为oldRepresentation(这意味着这些行是观察,而列是Firm,Year地点和市场份额)。每个firma都有一个新的表示形式,每个唯一年份有一行,按新月顺序排列,一列为该位置。它可能是,也可能不是稀疏表示,只有在矩阵稀疏的情况下才使用稀疏表示,而不是你在这里展示的情况。

这是一个更改表示的脚本,但请注意stackoverflow不能以这种方式工作。您必须自己编写代码,并将编码问题和您遇到的问题带给我们。既然你说你是初学者,那么你就可以使用matlab语法了解它。用它来锻炼其他点,作为你需要的欧几里德距离。请记住,您应尽量使您的问题尽可能通用。

oldRepresentation = [...
...% Firm  Year  Location  Market_share
      1     2000     1         0.1;...
      1     2000     2         0.2;...
      1     2000     3         0.5;...
      1     2000     4         0.2;...
      1     2001     1         0.3;...
      1     2001     2         0.0;...
      1     2001     3         0.2;...
      1     2001     4         0.5;...
      2     2000     1         0.0;...
      2     2000     2         0.4;...
      2     2000     3         0.2;...
      2     2000     4         0.4;...
      2     2001     1         0.1;...
      2     2001     2         0.5;...
      2     2001     3         0.3;...
      1     2001     4         0.1];

% Firm information (if you know these information a priori, you can
% set them directly):
firmsNumbers = unique(oldRepresentation(:,1))'; % Get unique firm
% numbers (suppose you have a firma that doesnt have a representation,
% in this case you will jump it.
nFirms = numel(firmsNumbers); % Total number of firms

% Year information:
years = unique(oldRepresentation(:,2))'; % Get unique years
nYears = numel(years); % Total number of years:

% Location information:
location = unique(oldRepresentation(:,3))'; % Unique locations
nLocations = max(oldRepresentation(:,3)); % Total number of locations

newRepresentation = cell(1,nFirms); % Pre allocate holder for the new
% representation, one cell for each firma, sparse representation.
nonSparse = cell(1,nFirms); % Pre allocate holder for the new
% representation, one cell for each firma, non sparse representation.

for curFirm=firmsNumbers % Loop on the firms
  firmLines=(oldRepresentation(:,1)==curFirm); % get lines which the

  % firm appears
  yearsOfOperation=oldRepresentation(firmLines,2); % get current firm
  % operation years
  % Transform the years to line indexes:
  [~,lineIdx] = ismember(yearsOfOperation,years);
  firmLocations=oldRepresentation(firmLines,3); % get current firm
  % operation locations
  newRepresentation{curFirm} = sparse(nYears,nLocations); % One line
  % for each year, one column for each location (sparse matrix
  % allocation).
  nonSparse{curFirm} = zeros(nYears,nLocations);
  marketShares=oldRepresentation(firmLines,4);
  % Now we fill this firm market share:
  for k=1:numel(yearsOfOperation)
    newRepresentation{curFirm}(lineIdx(k),firmLocations(k)) = ...
      marketShares(k);
    nonSparse{curFirm}(lineIdx(k),firmLocations(k)) = ...
      marketShares(k);
  end
end

结果非稀疏表示:

>> nonSparse{1} % First firma, first line is the 2000 year, each column a location from 1 to 4.

ans =

    0.1000    0.2000    0.5000    0.2000
    0.3000         0    0.2000    0.1000

>> nonSparse{2} % Second firma

ans =

         0    0.4000    0.2000    0.4000
    0.1000    0.5000    0.3000         0

稀疏表示:

>> newRepresentation{1} % First firm

ans =

   (1,1)       0.1000
   (2,1)       0.3000
   (1,2)       0.2000
   (1,3)       0.5000
   (2,3)       0.2000
   (1,4)       0.2000
   (2,4)       0.1000

>> newRepresentation{2} % Second firm

ans =

   (2,1)       0.1000
   (1,2)       0.4000
   (2,2)       0.5000
   (1,3)       0.2000
   (2,3)       0.3000
   (1,4)       0.4000