Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 链接对等点的对等点:替换2个链接对等点的多个列表_Variables_Stata - Fatal编程技术网

Variables 链接对等点的对等点:替换2个链接对等点的多个列表

Variables 链接对等点的对等点:替换2个链接对等点的多个列表,variables,stata,Variables,Stata,我有数据为受访者指定的朋友提供标识符。我正试图将两个相互关联的同龄人(不是受访者的朋友,而是受访者的朋友)联系起来,以便我可以使用这两个相互关联的同龄人的特征作为工具,研究同龄人的结果和特征对受访者的影响 // 4. Replace multiple listings of 2 link peers global mfofs "Mf1_mf1aid Mf1_mf2aid Mf2_mf1aid Mf2_mf2aid Ff1_mf1aid Ff2_mf2aid" global ffofs "M

我有数据为受访者指定的朋友提供标识符。我正试图将两个相互关联的同龄人(不是受访者的朋友,而是受访者的朋友)联系起来,以便我可以使用这两个相互关联的同龄人的特征作为工具,研究同龄人的结果和特征对受访者的影响

// 4. Replace multiple listings of 2 link peers



global mfofs "Mf1_mf1aid Mf1_mf2aid Mf2_mf1aid Mf2_mf2aid Ff1_mf1aid Ff2_mf2aid"
global ffofs "Mf1_ff1aid Mf1_ff2aid Mf2_ff1aid Mf2_ff2aid Ff1_ff1aid Ff2_ff2aid"




putmata aid Z=(Mf1_mf1aid Mf1_mf2aid Mf2_mf1aid Mf2_mf2aid Ff1_mf1aid Ff2_mf2aid Mf1_ff1aid Mf1_ff2aid Mf2_ff1aid Mf2_ff2aid Ff1_ff1aid Ff2_ff2aid) 

mata: 

/*
fofa = Z
for (i=1; i<=rows(Z); i++) {
    row = fofa[i,]'
    nvals[i] = length(uniqrows(select(row, (row :< .))))
}
*/


// The below is all sorts of wrong
fof = J(rows(Z), cols(Z), .)
 for (i=1; i<=rows(Z); i++) {
    for (j=1; j<=cols(Z); j++) {
        for (k=1; k<=cols(Z); k++) {
            if (Z[i,j] - Z[i,j+k] !=0) Z[i,j] = Z[i,j] 
        }
    }
}



end 
我已成功链接了2个链路对等点的标识符,但我需要将这2个链路对等点的重复条目替换为丢失,使每个2个链路对等点标识符只观察一次。也许这比我想象的要容易得多——我不是最聪明的,也不是最聪明的——但到目前为止我失败了。下面我提供了一组标识符的玩具数据集,以及我尝试过的工作步骤和我遇到的困难

我提供了我一直在进行的整个设置,但代码中的第4点使我陷入困境。这个玩具示例只列出了2个男性和2个女性朋友,但实际数据中最多列出了5个男性和5个女性朋友。如果有人对我如何使整个方法更一般、更直截了当有什么建议,我将不胜感激

在数据中,
aid
是个人标识符
mf1aid
是男性朋友1,依此类推。我需要将每个不是
aid
朋友的朋友链接到
aid
一些早期步骤需要
vlookup
程序

这些部件工作正常,但可能效率低下

clear all
clear mata
set more off





input aid  mf1aid mf2aid ff1aid ff2aid  
      101   102     103     106    .    
      102   101     104     106    .    
      103   101     104     107   108   
      104   105     102     108   109   
      105   104     101     106   110   
      106   101     102     107   108   
      107   103      .      106   110   
      108   103     104     109   108   
      109   104     101     108   110   
      110   105     104     109   107   

end 

/* The above data is setup so that some aid's name friends who reciprocate and some
name friends who do not reciprocate the link (as in the real data).  */




/* Need to link aid's of those 2 links away from each aid 

 It must do the following:
    1. Link the friend `aid`s of each person's friends
    2. Delete the friend of friends `aid`s that are also the person's 1 link friends
    3. Delete extra counts of 2 link `aid`s that may occur if a person's friends
        are all linked to a k `aid` that is not linked to i.        
    4. Delete self from friend of friend links. */




// Duplicating friend links because `vlookup.ado` would not link friends of friends id
forvalues i = 1(1)2 {

    gen mf`i'aid2 = mf`i'aid
    gen ff`i'aid2 = ff`i'aid

}   


/* 
Strategy: 1. use vlookup to attach the friend ids of each aid's friends,
          so for mf1aid it attaches that friend's mf1aid2, mf2aid2, ff1aid2, and ff2aid2
          2. delete self links in 2 link set
          3. delete own friends who are in 2 link set
          4. drop multiple listings in 2 link set to just 1 listing         

Mf_mf = "male friend male friend" so the male friends of i's male friends
Mf_ff = "male friend female friend"
Ff_mf = "female friend male friend"
Ff_ff = "female friend female friend"
*/  


// 1. Using vlookup.ado to link friends friend aids 
forvalues i = 1(1)2 {

    vlookup mf1aid, gen(Mf1_mf`i'aid) key(aid) value(mf`i'aid2)
    vlookup mf1aid, gen(Mf1_ff`i'aid) key(aid) value(ff`i'aid2)

    vlookup mf2aid, gen(Mf2_mf`i'aid) key(aid) value(mf`i'aid2)
    vlookup mf2aid, gen(Mf2_ff`i'aid) key(aid) value(ff`i'aid2)

    vlookup ff1aid, gen(Ff1_mf`i'aid) key(aid) value(mf`i'aid2)
    vlookup ff1aid, gen(Ff1_ff`i'aid) key(aid) value(ff`i'aid2)

    vlookup ff2aid, gen(Ff2_mf`i'aid) key(aid) value(mf`i'aid2)
    vlookup ff2aid, gen(Ff2_ff`i'aid) key(aid) value(ff`i'aid2)
}

drop mf1aid2-ff2aid2


// 2. Now Delete self links in friend of friend links
forvalues i = 1(1)2 {

    replace Mf1_mf`i'aid = . if Mf1_mf`i'aid == aid
    replace Mf2_mf`i'aid = . if Mf2_mf`i'aid == aid

    replace Ff1_mf`i'aid = . if Ff1_mf`i'aid == aid
    replace Ff2_mf`i'aid = . if Ff2_mf`i'aid == aid

}


// 3. Delete friends of friends who are also friends of i
forvalues i = 1(1)2 {

    replace Mf1_mf`i'aid = . if Mf1_mf`i'aid == mf1aid | Mf1_mf`i'aid == mf2aid     
    replace Mf1_ff`i'aid = . if Mf1_ff`i'aid == ff1aid | Mf1_ff`i'aid == ff2aid

    replace Mf2_mf`i'aid = . if Mf2_mf`i'aid == mf1aid | Mf2_mf`i'aid == mf2aid     
    replace Mf2_ff`i'aid = . if Mf2_ff`i'aid == ff1aid | Mf2_ff`i'aid == ff2aid

    replace Ff1_mf`i'aid = . if Ff1_mf`i'aid == mf1aid | Ff1_mf`i'aid == mf2aid     
    replace Ff1_ff`i'aid = . if Ff1_ff`i'aid == ff1aid | Ff1_ff`i'aid == ff2aid

    replace Ff2_mf`i'aid = . if Ff2_mf`i'aid == mf1aid | Ff2_mf`i'aid == mf2aid     
    replace Ff2_ff`i'aid = . if Ff2_ff`i'aid == ff1aid | Ff2_ff`i'aid == ff2aid

}
这是我一直坚持的步骤。因为每个人的一些朋友分享其他朋友,我现在剩下两个链接同龄人为每个受访者出现不止一次

// 4. Replace multiple listings of 2 link peers



global mfofs "Mf1_mf1aid Mf1_mf2aid Mf2_mf1aid Mf2_mf2aid Ff1_mf1aid Ff2_mf2aid"
global ffofs "Mf1_ff1aid Mf1_ff2aid Mf2_ff1aid Mf2_ff2aid Ff1_ff1aid Ff2_ff2aid"




putmata aid Z=(Mf1_mf1aid Mf1_mf2aid Mf2_mf1aid Mf2_mf2aid Ff1_mf1aid Ff2_mf2aid Mf1_ff1aid Mf1_ff2aid Mf2_ff1aid Mf2_ff2aid Ff1_ff1aid Ff2_ff2aid) 

mata: 

/*
fofa = Z
for (i=1; i<=rows(Z); i++) {
    row = fofa[i,]'
    nvals[i] = length(uniqrows(select(row, (row :< .))))
}
*/


// The below is all sorts of wrong
fof = J(rows(Z), cols(Z), .)
 for (i=1; i<=rows(Z); i++) {
    for (j=1; j<=cols(Z); j++) {
        for (k=1; k<=cols(Z); k++) {
            if (Z[i,j] - Z[i,j+k] !=0) Z[i,j] = Z[i,j] 
        }
    }
}



end 
//4。替换2个链路对等点的多个列表
全局mfofs“Mf1_mf1aid Mf1_mf2aid Mf2_mf1aid Mf2_mf2aid Ff1_mf1aid Ff2_mf2aid”
全局ffofs“Mf1_ff1aid Mf1_ff2aid Mf2_ff1aid Mf2_ff2aid Ff1_ff1aid Ff2_ff2aid”
putmata aid Z=(Mf1_mf1aid Mf1_mf2aid Mf2_mf1aid Mf2_mf2aid Ff1_mf2aid Mf1_ff1aid Mf2_ff1aid Mf2_ff2aid Ff1_ff1aid Ff2_ff2aid)
马塔:
/*
fofa=Z

对于(i=1;i如果您将所有这些变量存储在一行中(从您使用的代码和命名来看似乎是这样),也许您可以将其重塑为一个长数据集,然后使用其中一个重复命令来标记或消除重复


注意:这可能是一个评论,而不是一个答案,但我没有这样做的名声…

正如Danielle所建议的,处理长格式的数据通常要简单得多

所需要的是朋友的朋友列表。列表中的朋友不能是一级朋友。在示例数据中,对于
aid==101
,只有
102
的朋友不是
101
101
的一级朋友是
104

在下面的代码中,我使用
rangejoin
(来自SSC)将每个观察的朋友与其朋友配对

* Example generated by -dataex-. To install: ssc install dataex
clear
input float(aid mf1aid mf2aid ff1aid ff2aid)
101 102 103 106   .
102 101 104 106   .
103 101 104 107 108
104 105 102 108 109
105 104 101 106 110
106 101 102 107 108
107 103   . 106 110
108 103 104 109 108
109 104 101 108 110
110 105 104 109 107
end

* convert to long form
rename aid id
reshape long @aid, i(id) j(mfn) string
drop if mi(aid)
drop mfn
isid id aid, sort

* save each id's list of friends
save "friends.dta", replace

* first level of friends
rename aid friend1

* pair each observation with using obs where id is the same as friend1 in current obs
rangejoin id friend1 friend1 using "friends.dta"
rename aid friend2
drop *_U friend1

* remove self and duplicates
drop if id == friend2
bysort id friend2: keep if _n == 1

* remove those are are first level friends
rename friend2 aid
merge 1:1 id aid using "friends.dta", keep(master) nogen

Robert这比我的方法要有效得多,谢谢@Danielle。但是,我需要真正的对等点,也就是那些由2个链接分隔的对等点。对于节点集{I,j,k}如果我链接到j,j链接到k,但我和k没有链接,我需要k作为i而不是j和k的friend2。因此,对于friend2,也出现在friend1下的人必须设置为missing或Drop。我现在正在处理这个问题。如果我弄明白了,那么我会注意到更改。谢谢你的帮助!如果我理解正确,这更简单。我有一个相应地调整了代码。最后,你找到朋友的朋友,然后简单地保留那些与一级朋友不匹配的朋友。是的,这是正确的,你的方法非常有效。我会投票给你的答案,但显然我还不被允许。我从未在这个论坛上问过任何问题,所以我不知道你可以得到什么,但我相信eve表示您可以选择“接受”我的答案。根据帮助:“接受由问题原始作者已接受的答案旁边的彩色复选标记表示。”