我有几个包含来自各个议会和议会的唱名表数据的数据集。每个数据集有100到800个观测值。有一些变量可以识别MP /代表(姓名,当事人,选区等),其余变量(在某些情况下高达1500)是他们投票的票据或动议(对于大多数情况,投票变量是命名为v1,v2,v3等)。这些变量用数字编码为1 = yay,-1 = nay,0 = absent /弃。
我需要从这些数据中创建几个成对矩阵。我已经设法用stata在矩阵上做基本函数,我遇到的麻烦是找到一种从成对函数创建每个矩阵的简单方法。除了常用函数,如相关和距离矩阵之外,似乎所有东西都必须手动输入!
我需要创建的第一个矩阵包含两位代表在同一议案上投票的比例。它忽略了任何一个人都没有投票的情况。也就是说,对于每对代表,每个变量的数字都是-1,而不是每个变量都有一个非零值的总数。
我需要的其他矩阵大致相同,我只需要计算对于nay-yay,yay-nay和yay-yay的对,所以如果有人可以帮助我如何创建这些矩阵中的一个我我会在路上。我一直试图解决这个问题四天,而且我确实没有一行代码可以接近,所以我很抱歉,如果好像我要求别人为我做这一切。我是Stata中的矩阵新手,所以如果有人能给我最小的指针,我将不胜感激。
谢谢!
答案 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 之外的任何内容,它应该可以正常工作封装