楼主: jzhyue
12857 40

[其他] 感谢Sungmoo版主:将程序变成ado命令(问题完美解决) [推广有奖]

11
sungmoo 发表于 2009-12-10 20:14:04
*前三个变量必须单列(后面的变量可以用缩略式);若使用in条件,则其中不能使用f或l。
cap pr drop gsca
pr gsca
syntax varlist [if] [in]
args m f r
marksample cond
qui{
  keep if `cond'
  macro shift 3
  loc v=subinstr(subinstr("`*'","`if'","",.),"`in'","",.)
  foreach vi of var `v' {
    egen `vi'std=std(`vi')
    bys `m' `f' (`r'):egen `vi'e=mean(`vi'std)
    bys `m' (`f'):egen `vi'mg=mean(`vi'e)
    bys `f' (`r'):egen `vi'fg=mean(`vi'e)
    g `vi'sca=`vi'e-`vi'mg-`vi'fg
    drop `vi' `vi'std
  }
  keep if `r'==1
}
end
已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 10 + 1 + 1 + 1 热心帮助其他会员
nlm0402 + 1 + 1 + 1 + 1 + 1 精彩帖子
jzhyue + 1 + 1 + 1 精彩帖子
dxystata + 10 好的意见建议

总评分: 经验 + 101  论坛币 + 21  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

12
jzhyue 发表于 2009-12-10 21:21:22
感谢Sungmoo:
    问题完美解决,有Help 就有Sungmoo版主。(在我想着如何用tempvar时。Sungmoo老师就双给出更完美的程式)再次thanks
    祝心情愉快,工作顺利,万事吉祥。

13
abc7759abc 发表于 2009-12-11 00:22:57
看不懂……
历史是个什么玩意儿~

14
jzhyue 发表于 2009-12-13 13:40:02
sungmoo 发表于 2009-12-10 20:14
*命令格式是 gsca v1 v2 v3|v4-vn if in,即m f r对应的变量与其他变量以“|”分开。
cap pr drop gsca
pr gsca
syntax anything [if] [in]
marksample cond
qui keep if `cond'
tempvar vv1 vv2 vv3
loc varlist1=substr("`anything'",1,strpos("`anything'","|")-1)
loc varlist2=substr("`anything'",strpos("`anything'","|")+1,.)
foreach ui of var `varlist1'{
loc i=`i'+1
qui g `vv`i''=`ui'
}
foreach vi of var `varlist2' {
qui egen `vi'std=std(`vi')
qui bys `vv1' `vv2' (`vv3'):egen `vi'e=mean(`vi'std)
qui bys `vv1' (`vv2'):egen `vi'mg=mean(`vi'e)
qui bys `vv2' (`vv3'):egen `vi'fg=mean(`vi'e)
qui g `vi'sca=`vi'e-`vi'mg-`vi'fg
qui drop `vi' `vi'std
}
qui keep if `vv3'==1
end
将sungmoo提供的程序修饰的更简洁和条理化,请sungmoo指导,
cap pr drop gsca
pr gsca
syntax varlist  [if] [in],MCode(string) FCode(string)  Rep(string)
marksample cond
qui keep if `cond'
foreach vi of var `varlist' {
qui egen `vi'std=std(`vi')
qui bys `mcode' `fcode' (`rep'):egen `vi'e=mean(`vi'std)
qui bys `mcode' (`fcode'):egen `vi'mg=mean(`vi'e)
qui bys `fcode' (`mcode'):egen `vi'fg=mean(`vi'e)
qui g `vi'sca=`vi'e-`vi'mg-`vi'fg
qui drop `vi' `vi'std
}
qui keep if `rep'==1
qui drop `rep'
end
已有 1 人评分论坛币 收起 理由
dxystata + 5 好的意见建议

总评分: 论坛币 + 5   查看全部评分

15
sungmoo 发表于 2009-12-13 18:17:45
jzhyue 发表于 2009-12-13 13:40 将sungmoo老师提供的程序修饰的更简洁和条理化
上面这组命令生成的gsca似乎执行不了?

16
jzhyue 发表于 2009-12-13 19:35:07
sungmoo 发表于 2009-12-13 18:17
上面这组命令生成的gsca似乎执行不了?
可以执行的。
*在目标目录下
use 示例数据,clear
gsca lch lh,mc(m) fc(f) r(r)

17
sungmoo 发表于 2009-12-13 20:18:28
jzhyue 发表于 2009-12-13 19:35可以执行的。
知道问题出在哪了,差了一处大小写。

***********************

上面的程序内容简洁(不过命令表述上可能代码较多)。

18
jzhyue 发表于 2009-12-14 15:50:53
郁闷!
请sungmoo和路过的老师、同学们帮忙!
由下列代码中foreach of var varlist所生成的多个temfile不知道如何纵向连接并文件输出?
数据同1#的示例数据。
capture program drop ychcsh
program define ychcsh
syntax  varlist [if] [in], MCode(string) FCode(string) Rep(string) Con(string)
foreach v of var `varlist' {
preserve
tempfile tem`v'
keep `v' `mcode' `fcode' `rep'
anov `v' `mcode' `fcode' `rep' `con'
ereturn list
gen name=e(depvar)
gen msd=(e(ss_1)-e(ss_4))/((e(df_3)+1)*(e(df_2)+1))
gen fsd=(e(ss_2)-e(ss_4))/((e(df_3)+1)*(e(df_1)+1))
gen ssd=(e(ss_4)-e(rss))/(e(df_3)+1)
gen esd=e(rss)
gen gsd=msd+fsd+ssd
gen psd=esd+gsd
gen gcavg=(msd+fsd)/gsd
gen scavg=ssd/gsd
gen hb=gsd/ssd
gen hn=(msd+fsd)/ssd
drop `v' `mcode' `fcode' `rep'
keep in 1
save "`tem`v''"
restore
}

end
use 示例数据
ychcsh varlist,mc(m) fc(f) r(r) con(m#f)            //命令格式
数据同1#的示例数据。

19
sungmoo 发表于 2009-12-14 15:55:20
jzhyue 发表于 2009-12-14 15:50 由下列代码中foreach of var varlist所生成的多个temfile不知道如何纵向连接并文件输出?
用app using

20
sungmoo 发表于 2009-12-14 16:04:04
*试一下

cap pr drop ychcsh
pr ychcsh
syntax  varlist [if] [in], MCode(string) FCode(string) Rep(string) Con(string)
tempfile a

preserve
clear
g xxx=.
save `a'
restore

foreach v of var `varlist' {
preserve
keep `v' `mcode' `fcode' `rep'
an `v' `mcode' `fcode' `rep' `con'
ereturn list
g name=e(depvar)
g msd=(e(ss_1)-e(ss_4))/((e(df_3)+1)*(e(df_2)+1))
g fsd=(e(ss_2)-e(ss_4))/((e(df_3)+1)*(e(df_1)+1))
g ssd=(e(ss_4)-e(rss))/(e(df_3)+1)
g esd=e(rss)
g gsd=msd+fsd+ssd
g psd=esd+gsd
g gcavg=(msd+fsd)/gsd
g scavg=ssd/gsd
g hb=gsd/ssd
g hn=(msd+fsd)/ssd
drop `v' `mcode' `fcode' `rep'
keep in 1
app using `a'
save `a',replace
restore
}
preserve
use `a',clear
drop xxx
list
restore
end
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 10 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  论坛币 + 10  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-27 03:11