楼主: vasami
2869 7

[编程问题求助] [求助]有个公式是否可以通过stata实现? [推广有奖]

  • 1关注
  • 0粉丝

高中生

77%

还不是VIP/贵宾

-

威望
0
论坛币
2184 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
316 点
帖子
24
精华
0
在线时间
41 小时
注册时间
2012-7-28
最后登录
2025-2-19

楼主
vasami 发表于 2016-1-18 22:15:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
OA{4}J35`FOU2V4FU`[80BY.png 该公式中研究对象的指标ab、bc、cd为已知变量,ref1、ref2、ref3是随着age(0到90岁)的变化而变化。
假设第一研究对象age1=20。则Y等于上述公式从0至age1(20)的累加
第二个观测对象age1=30, 则Y等于上述公式从0至30的累加。
不知道这样描述问题是不是更合适,这个问题已经困扰我很久了,但是编程0基础,始终没有得到解决,我运行了以下命令只能得到每个观测对象的0岁的y,而不能累加:
gen Y=.
local N=`age1'+1
forvalues i =1(1)`N' {
           replace Y=((ab-0.4)*ref1[`N]'+(bc-0.19)*ref2[`N']+(cd-2.0.045)*ref3[`N'])/1000*366-0.79
               }


显然这个程序是不对的,但是真不知道如何实现这个公式,望对于stata编程比较精通的精英们能解此惑,或给点建议,多谢了!
二维码

扫码加我 拉你入群

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

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

关键词:Stata tata forvalues forvalue replace replace local

沙发
丢丢rainorshine 发表于 2016-1-18 23:57:02 来自手机
vasami 发表于 2016-1-18 22:15
该公式中研究对象的指标ab、bc、cd为已知变量,ref1、ref2、ref3是随着age(0到90岁)的变化而变化。
假设第 ...
你这样设计,也没有实现叠加啊。只是一个公式rep的循环计算。。没有叠加效果

藤椅
夏目贵志 发表于 2016-1-19 00:29:59
提供一个思路。
gen Y=0
[foreach observation or each group of people with the same age]
local N=`age1'+1
forvalues i =1(1)`N' {
    replace Y=Y+ ((ab-0.4)*ref1[`N]'+(bc-0.19)*ref2[`N']+(cd-2.0.045)*ref3[`N'])/1000*366-0.79 [use if or in condition to do only for people in the group]
}
[end foreach]

板凳
vasami 发表于 2016-1-19 09:06:17
夏目贵志 发表于 2016-1-19 00:29
提供一个思路。
gen Y=0
[foreach observation or each group of people with the same age]
十分感谢您的回复,不过我还是木有理解[sweat][sweat]

报纸
vasami 发表于 2016-1-19 11:25:24
丢丢rainorshine 发表于 2016-1-18 23:57
你这样设计,也没有实现叠加啊。只是一个公式rep的循环计算。。没有叠加效果
是的那,不知道怎么叠加。。。。
local N=`age1'+1
forvalues i =1(1)`N' {
           qui gen Y`N'=((ab-0.4)*ref1[`N]'+(bc-0.19)*ref2[`N']+(cd-2.0.045)*ref3[`N'])/1000*366-0.79
            egen YY=rowtotal(Y`N')
            drop Y`N'
              }
这样还是没有叠加的效果...(⊙﹏⊙)b

地板
vasami 发表于 2016-1-19 11:29:32
丢丢rainorshine 发表于 2016-1-18 23:57
你这样设计,也没有实现叠加啊。只是一个公式rep的循环计算。。没有叠加效果
对呀,好苦恼
local N=`age1'+1
forvalues i =1(1)`N' {
           qui gen Y`N'=((ab-0.4)*ref1[`N]'+(bc-0.19)*ref2[`N']+(cd-2.0.045)*ref3[`N'])/1000*366-0.79
           egen YY=rowtotal(Y`N')
           drop Y`N'
               }
这样修改依然没有叠加的效果...~~~~(>_<)~~~~

7
夏目贵志 发表于 2016-1-19 12:15:37
vasami 发表于 2016-1-19 09:06
十分感谢您的回复,不过我还是木有理解
大概意思就是所你得把数据按年龄分组然后一组一组的求。因为年龄不同需要相加的次数是不同的。把我上面方括号里的部分改成相应的代码应该就能行了。至少是个开始。

8
天南水北 发表于 2018-1-28 11:32:13
【洛阳铲】其实这种公式还真的有的。用expand加sum的组合就可以实现这么诡异的要求。
你这个情况下,是不是两个dta。第一个A.dta是age ref1 ref2 ref3;第二个B.dta是age ab cd ef
方法其实很简单。
use B.dta,clear
gen id=_n
expand age
sort id
by id,sort:replace age=_n
merge age m:1 using A.dta
keep if _merge==3
gen x=((ab-0.4)*ref1+(bc-0.19)*ref2+(cd-2.0.045)*ref3)/1000*366-0.79
sort id age
by id,sort:gen y=sum(x)
by id,sort:keep if _n==_N
搞定

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

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