*! version 1.0  18june2014  Sebastian Pink

program define npinfo

	version 11

	syntax varlist, id(varlist) npcov(varlist) replace [dyads(string)]



	quietly{


	* Avoid mistakes
	* -------------- +
	// ID in one variable
	if `: word count `id'' > 1 {
		di as err "ID has to be one variable."
		exit
	}
	// dyads' variable name has to be one word
	if `: word count `dyads'' > 1 {
		di as err "Dyadic variable can't be named with a space."
		exit
	}





	* Step 1: Extract information from network partners and merge to focus person
	* --------------------------------------------------------------------------- +

	// Generate two tempfiles
	forv tmpfle = 1/2 {
		tempfile tmpfle`tmpfle'
	}


	// save original state of dataset
	save `tmpfle1', replace

	// Merge every information to the pertaining network partner
	foreach np of varlist `varlist' {

			// Prepare requested information about network partners
			keep `id' `npcov'
			rename `id' `np'
			loc npcovars_added ""
			foreach npcovar of varlist `npcov' {
				rename `npcovar' `np'_`npcovar'
				loc npcovars_added "`npcovars_added' `np'_`npcovar'"
			}
			save `tmpfle2', replace

			// Merge requested information to network partners
			use `tmpfle1', clear
			merge n:1 `np' using `tmpfle2', keep(1 3)
			foreach npcovar of varlist `npcov' {
				replace `np'_`npcovar' = .a if _merge == 1 // Indicate nodes without participation (unit-nonresponse)
			}
			drop _merge

			order `npcovars_added', after(`np')
			save `tmpfle1', replace

	}






	* [Optional] Step 2: Make a dyadic dataset according to the network partners
	* -------------------------------------------------------------------------- +
	if "`dyads'" != "" {

		// Rename variables according to a unique scheme to get them reshaped properly
		unab oldvarlist: `varlist'

		forv npvar = 1/`: word count `oldvarlist'' {

			// Identifier
			ren `: word `npvar' of `oldvarlist'' `dyads'`npvar'

			// NP-Variables
			foreach npcovariate in `npcov' {
				ren `: word `npvar' of `oldvarlist''_`npcovariate' `dyads'`npvar'_`npcovariate'
			}
		}

		// Generate reshape syntax
		loc reshape_syntax "`dyads'@"
		foreach npcovariate in `npcov' {
			loc reshape_syntax "`reshape_syntax' `dyads'@_`npcovariate'"
		}

		// Reshape data to long
		reshape long `reshape_syntax', i(`id') j(newvar)
		drop newvar

			* If one node has no outgoing ties, this node should
			* nevertheless be kept because it denotes an isolate. Therefore, the syntax deleting
			* empty links generated via reshape have to respect those nodes.
			* This is crucial for longitudinal networks. If these nodes aren't entailed,
			* between two time points the set of nodes might differ while individual
			* information on the same node is available in both time points.
			bys `id': egen npinfo_helper1 = max(`dyads')
			drop if mi(`dyads') & !mi(npinfo_helper1)
			bys `id': drop if mi(npinfo_helper1) & _n > 1
			drop npinfo_helper1

	sort `id'

	}

	}

end


* END.