Matrix 用Stata创建成对矩阵

Matrix 用Stata创建成对矩阵,matrix,stata,Matrix,Stata,我有几个数据集,其中包含来自各个议会和议会的点名数据。每个数据集有100到800个观测值。有几个变量可以识别议员/代表(姓名、党派、一致性等),其余变量(在某些情况下高达1500)是他们投票的法案或动议(在大多数情况下,投票变量被命名为v1、v2、v3等)。这些变量的数字编码为1=yay、-1=nay和0=缺席/弃权 我需要根据这些数据创建几个成对矩阵。我已经设法用stata对矩阵执行基本函数,我遇到的麻烦是找到一种简单的方法,从成对函数创建每个矩阵。除了常用的功能,如相关性和距离矩阵,似乎一切

我有几个数据集,其中包含来自各个议会和议会的点名数据。每个数据集有100到800个观测值。有几个变量可以识别议员/代表(姓名、党派、一致性等),其余变量(在某些情况下高达1500)是他们投票的法案或动议(在大多数情况下,投票变量被命名为v1、v2、v3等)。这些变量的数字编码为1=yay、-1=nay和0=缺席/弃权

我需要根据这些数据创建几个成对矩阵。我已经设法用stata对矩阵执行基本函数,我遇到的麻烦是找到一种简单的方法,从成对函数创建每个矩阵。除了常用的功能,如相关性和距离矩阵,似乎一切都必须手动输入

我需要创建的第一个矩阵包含两位代表对同一动议投反对票的次数。它忽略了任何一方未投票的情况。也就是说,对于每对代表,每个变量都是-1的数字,超过总数,其中每个变量都有一个非零的值

我需要的其他矩阵基本相同,我只需要计算nay-yay,yay-nay和yay-yay的对,所以如果有人能帮我创建这些矩阵中的一个,我马上就来。我四天来一直在努力解决这个问题,但实际上我没有一行代码可以接近,所以如果我似乎在要求别人为我做这一切,我很抱歉。我对Stata中的矩阵完全是新手,所以如果有人能给我最小的指针,我将不胜感激


谢谢

以下是如何获取第一个矩阵的示例:

clear

/* Fake Data */
input str1 voter law1 law2 law3 law4
"a" 0 1 1 1 
"b" -1 -1 0 0 
"c" 1 -1 1 0
"d" 0 1 1 1
"e" -1 -1 -1 -1
end

/* Convert data to nays vs not-nays */
recode law* (-1=1) (0=0) (1=0)

/* Get the similarity */
matrix diss M_nay = law*, matching observations names(voter)
matrix list M_nay
照目前的情况,这对丢失的数据不太管用。如果您愿意使用相异系数,您可以这样做:

matrix diss M_nay = law*, Gower observations names(voter)
这个问题没有显示任何研究成果,但确实提到了这个问题:

四天来我一直在努力解决这个问题,但实际上我没有 只有一行代码可以接近,所以如果 好像我在请人帮我做这一切

不幸的是,这不太可能说服一些人在堆栈溢出中回答问题。四天的工作肯定会产生一些代码/知识,你可以分享这些代码/知识,让别人相信你的辛勤工作,那么为什么不发布呢

在发布其他问题之前,请先浏览和中的提问部分

我自己不是Stata矩阵专家,我可以分享一些代码,我相信这些代码可以做一些您想要的事情。它可能很容易改进。我看到的唯一问题是,你可能需要调整产生最终结果的比率分母。我只是除以数据集中的票据数

clear all
set more off

*----- example data -----

input ///
rep bil1 bil2 bil3
1 1 -1 0
2 1 -1 -1
3 -1 -1 -1
4 0 -1 0
5 1 0 1
end

label define lblbil 1 "yay" -1 "nay" 0 "abs"
label values bil* lblbil

list

*----- what you want -----

// compute info
local numbills = 3
local numreps = 5

tempfile first
save "`first'"

rename _all =0

cross using "`first'"

sort rep0 rep
list

drop if rep0 >= rep

gen countnn = 0
gen countyy = 0
gen countny = 0
gen countyn = 0
forvalues i = 1/`numbills' {
    replace countnn = countnn + (bil`i'0 == -1 & bil`i'0 == bil`i') 
    replace countyy = countyy + (bil`i'0 ==  1 & bil`i'0 == bil`i')
    replace countny = countny + (bil`i'0 == -1 & bil`i' == 1)
    replace countyn = countyn + (bil`i'0 ==  1 & bil`i' == -1)
}

list, sepby(rep0)

// put in matrices
mkmat rep0 rep count*
local totrows = rowsof(rep0)

matrix nn = J(`numreps',`numreps',.z)
matrix yy = J(`numreps',`numreps',.z)
matrix ny = J(`numreps',`numreps',.z)
matrix yn = J(`numreps',`numreps',.z)
forvalues i = 1/`totrows' {
     matrix nn[rep0[`i'],rep[`i']] =  countnn[`i']/3
     matrix yy[rep0[`i'],rep[`i']] =  countyy[`i']/3
     matrix ny[rep0[`i'],rep[`i']] =  countny[`i']/3
     matrix yn[rep0[`i'],rep[`i']] =  countyn[`i']/3
} 

// list matrices
matrix list nn, format(%10.2g) nodotz
matrix list yy, format(%10.2g) nodotz
matrix list ny, format(%10.2g) nodotz
matrix list yn, format(%10.2g) nodotz

cross
临时扩展了数据集中的观察值数量,但您提到了最初最多800个观察值,因此只要您没有小Stata包,它就可以正常工作。

也就是说,@Dimitry建议免费使用
集群
分析中现有的Stata矩阵操作工具。这是一个巧妙的技巧,+1!对这太棒了!在这里,我想我必须运行一些递归循环来输入矩阵,您可以相对简单地通过从原始数据中排除不需要的值来创建它。昨晚我偷看了一下回复,由于缺少值而不确定,但今天我回到家发现你也在考虑这个问题!我需要所有的矩阵在以后的记忆中,当我来和他们一起工作,但我会解决一些问题。非常大的帮助,谢谢!你知道怎么做“不”和“不”的版本吗?有点困难,因为你必须说明谁投了哪种票。@48620不幸的是,这是一个更难的问题。我想不出一个聪明的方法来做这件事。