楼主: wating2003
3257 11

please help!! stata looping [推广有奖]

  • 1关注
  • 0粉丝

博士生

35%

还不是VIP/贵宾

-

威望
0
论坛币
6 个
通用积分
15.0182
学术水平
2 点
热心指数
2 点
信用等级
2 点
经验
667 点
帖子
79
精华
0
在线时间
457 小时
注册时间
2007-4-9
最后登录
2024-9-11

楼主
wating2003 发表于 2010-6-9 09:15:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请大虾们帮忙看看!! 先谢谢啦!!
我有两组数据x和y, 当y=0的时候,需要求其对应的x值与前一个x值的差,如果两个x值的差为0,继续往上减,直到它不为0。
举个例子:
x    y
6    5
7    6
5    8
4    7
4    0
3    6
2    8
1    0

希望得出一组结果是
z
0
0
0
0
-1
0
0
-1

为什么我写的程序跑不出来??
gen id=_n
gen z=0
replace z=. if y!=0

program define Test

local i=1

while z==0 {
   
    replace z[_n]=x[_n]-x[_n-`i'] if z==0
    local i=`i'+1
   
}
   
end
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:looping please Lease Stata loop Stata Help please looping

沙发
houquan 发表于 2010-6-9 12:29:19
set more off
cd c:\data

clear
input x y
6    5
7    6
5    8
4    7
4    0
3    6
2    8
1    0
end

gen id = _n
tset (id)
gen x0 = 0
replace x0 = . if y != 0
recast int x y id x0
list

forvalues i = 1(1)7 {
        gen x`i' = L`i'.x
        replace x`i' = x - x`i'
}

list

save master.dta, replace

keep x0-x7
xpose, clear varname

local new = _N + 1
set obs `new'

foreach var of varlist v* {
        replace `var' = 0 in 9
}

foreach var of varlist v* {
        forvalues i = 1/7 {
                replace `var' = `var'[`i' + 1] in 9 if `var'[`i'] == 0 & `var'[`i' + 1] != 0
        }
}

replace _varname = "x_result" in 9

xpose, clear varname

gen id = _n
keep id x_result
order id x_result

save using.dta, replace

use master, clear
merge 1:1 id using using
keep x y id x_result
list
已有 1 人评分论坛币 收起 理由
宋凌峰 + 20 根据规定进行奖励

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

We all love to instruct, though we can teach only what is not worth knowing. -- J. Austen

藤椅
wating2003 发表于 2010-6-10 03:27:01
2# houquan

谢谢帮忙,请问可以简化吗? 我在实际操作中不止8个数呢 怎么办 ?? :)

板凳
wating2003 发表于 2010-6-10 04:30:25
2# houquan

因为我的数据很多,这个程序跑着跑着就说内存不足了

报纸
houquan 发表于 2010-6-10 11:16:18
4# wating2003
可以试试 set memory ,把内存设置得大一点,看看行不行。如果还不行,再考虑简化程序。
We all love to instruct, though we can teach only what is not worth knowing. -- J. Austen

地板
sungmoo 发表于 2010-6-10 11:54:15
inp x y
1 0
1 0
1 0
1 0
1 0
end
*这种情况z应该是什么?

7
houquan 发表于 2010-6-10 12:02:50
6# sungmoo
这个编程的题挺好玩的;写代码前我也想了一下,最后的结果应该有三种情况:
1)起始的时候y不是0,那么可以标记 z 为 missing value;
2)起始的时候y是0,向前做减法,在穷尽之前做出不是0的结果,赋值给z;
3)起始的时候y是0,向前做减法,穷尽到第一个observation,差值还是0(版主的例子就是这种情况),那么z标记为0。

这样做的结果,是3种情况对应z的三个不同取值(missing value, 非零, 零)。这样的话,上面的代码还要改一下了。
We all love to instruct, though we can teach only what is not worth knowing. -- J. Austen

8
wating2003 发表于 2010-6-10 17:18:39
7# houquan

对,我就是想这个思路, 试过改内存了,还是空间不足,因为stata的横向数据好像不能超30000多. 我的纵向有55822个数据,按照前面那个程序就不行了

9
houquan 发表于 2010-6-10 18:38:47
8# wating2003
那就把数据分成两部分,divide and conquer。
We all love to instruct, though we can teach only what is not worth knowing. -- J. Austen

10
wating2003 发表于 2010-6-10 19:03:47
9# houquan

请问有办法让他不要生成那么多variables 吗?

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

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