用Stata创建成对矩阵

时间:2014-08-18 15:39:28

标签: matrix stata

我有几个包含来自各个议会和议会的唱名表数据的数据集。每个数据集有100到800个观测值。有一些变量可以识别MP /代表(姓名,当事人,选区等),其余变量(在某些情况下高达1500)是他们投票的票据或动议(对于大多数情况,投票变量是命名为v1,v2,v3等)。这些变量用数字编码为1 = yay,-1 = nay,0 = absent /弃。

我需要从这些数据中创建几个成对矩阵。我已经设法用stata在矩阵上做基本函数,我遇到的麻烦是找到一种从成对函数创建每个矩阵的简单方法。除了常用函数,如相关和距离矩阵之外,似乎所有东西都必须手动输入!

我需要创建的第一个矩阵包含两位代表在同一​​议案上投票的比例。它忽略了任何一个人都没有投票的情况。也就是说,对于每对代表,每个变量的数字都是-1,而不是每个变量都有一个非零值的总数。

我需要的其他矩阵大致相同,我只需要计算对于nay-yay,yay-nay和yay-yay的对,所以如果有人可以帮助我如何创建这些矩阵中的一个我我会在路上。我一直试图解决这个问题四天,而且我确实没有一行代码可以接近,所以我很抱歉,如果好像我要求别人为我做这一切。我是Stata中的矩阵新手,所以如果有人能给我最小的指针,我将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:0)

这个问题显示没有研究工作,但确实提到了这个问题:

  

我一直试图解决这个问题四天,而我实际上并没有这样做   有一行代码可以到达任何地方,所以我很抱歉   好像我要求别人为我做这一切。

不幸的是,这不太可能说服一些人在Stack Overflow中回答问题。四天的工作必然会产生一些代码/知识,你可以分享,以说服别人你的辛勤工作,为什么不发布呢?

在发布其他问题之前,请先查看https://stackoverflow.com/help以及whathaveyoutried.com中的提问部分。

我自己不是Stata矩阵专家,我可以分享一些我认为可以完成你想做的事情的代码。它可以很容易地改进。我看到的唯一问题是,您可能需要调整产生最终结果的比率的分母。我只是在数据集中除以账单数量(3)。

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,所以只要你有 Small Stata 之外的任何内容,它应该可以正常工作封装