楼主: hiderm
3644 8

[编程问题求助] 已解决: 这个循环语句有什么问题? 答: 错误使用min() 函数 [推广有奖]

已卖:5227份资源

院士

59%

还不是VIP/贵宾

-

威望
1
论坛币
59505 个
通用积分
4044.5148
学术水平
253 点
热心指数
332 点
信用等级
219 点
经验
76220 点
帖子
2202
精华
1
在线时间
2767 小时
注册时间
2006-6-3
最后登录
2025-9-20

楼主
hiderm 发表于 2013-2-23 15:20:25 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
目标: 对 多个 总量指标变量 实施 对数变换(所有变量均大于等于零)
其中, 对于最小值是 0 的变量, 对数变换为 ln(1+var)
         对于最小值 非零 的变量, 对数变换为 ln(var)

原始程序:
local f "x y z"
  foreach v of varlist `f' {

      local s = min( `v' )              // 错误地使用 min() 函数
         if `s' == 0 {
            gen ln_`v' = ln( 1 + `v' )
            label var ln_`v' "ln(1+`v')"
            order ln_`v', after( `v' )
          }
         else {
            gen ln_`v' = ln( `v' )
            label var ln_`v' "ln(`v')"
            order ln_`v', after( `v' )
         }
   }

原始程序注释:

local f "x y z"                                    // 定义局部宏`f' 为双引号中的元素
  foreach v of varlist `f' {                   //
设定循环条件: 定义局部宏 `v' 为变量列表(varlist)的每一项
      local s = min( `v' )                     // 定义局部宏`s' 为局部宏`v' 所代表的变量的最小值
         if `s' == 0 {                           // if语句: 如果 `s' = 0
            gen ln_`v' = ln( 1 + `v' )      // 创建名为ln_`v' 的变量, 取值为 ln(1+`v')
            label var ln_`v' "ln(1+`v')"    // 给新生成的ln_`v' 添加标签为"
ln(1+`v')"
            order ln_`v', after( `v' )        // 将新生成的
ln_`v' 排序到 `v' 之后
          }                                          // if语句结束
         else {
            gen ln_`v' = ln( `v' )
            // 否则(即if `s' != 0), 创建名为ln_`v' 的变量, 取值为 ln(`v')
            label var ln_`v' "ln(`v')"
        // 给新生成的ln_`v' 添加标签为"ln(`v')
            order ln_`v', after( `v' )
        // 将新生成的ln_`v' 排序到 `v' 之后
         }                                           // else语句结束
   }

自己检查了好几遍, 认为没有问题, 可是在stata12中运行, 总是报告:
invalid syntax
r(198);

特此向各位坛友请教! 烦请发现问题的坛友 用红色字体标记出错的地方, 并在第二行提供正确的程序代码. 谢谢!


感谢 蓝色版主
错误原因在于: 我在
没有对其功能真正了解的情况下, 想当然地使用了 min() 函数
修改后的正解在 7楼

二维码

扫码加我 拉你入群

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

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

关键词:循环语句 已解决 Min varlist foreach

[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

沙发
蓝色 发表于 2013-2-23 15:31:38
你的
min 函数能用吗

你不编写循环,自己先单独试试这些函数

藤椅
hiderm 发表于 2013-2-23 15:38:34
蓝色 发表于 2013-2-23 15:31
你的
min 函数能用吗
哦, 好的, 我试试看!
[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

板凳
hiderm 发表于 2013-2-23 15:40:43
蓝色 发表于 2013-2-23 15:31
你的
min 函数能用吗
蓝色版主的意思是, 下面这句可能有问题?

local s = min(`v')
[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

报纸
蓝色 发表于 2013-2-23 15:43:47

sysuse auto,clear
local s=min(price)

你看看 能不能执行啊

函数你的看帮助

地板
hiderm 发表于 2013-2-23 15:46:39
蓝色 发表于 2013-2-23 15:43

sysuse auto,clear
local s=min(price)
呵呵, 刚才看帮助文件了, 是不对!

有什么方法能让局部宏`s' 定义为 `v'的最小值呢?
[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

7
hiderm 发表于 2013-2-23 15:54:41
蓝色 发表于 2013-2-23 15:43

sysuse auto,clear
local s=min(price)
想到一个方法, 在定义局部宏 `s' 之前,
先用summarize `v'
然后定义 局部宏`s' 为 r(min)

更正后的程序如下:
local f "x y z"
  foreach v of varlist `f' {
      summarize `v'
      local s = r(min)
         if `s' == 0 {
            gen ln_`v' = ln( 1 + `v' )
            label var ln_`v' "ln(1+`v')"
            order ln_`v', after( `v' )
          }
         else {
            gen ln_`v' = ln( `v' )
            label var ln_`v' "ln(`v')"
            order ln_`v', after( `v' )
         }
   }


[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

8
dxystata 发表于 2013-2-23 22:42:46
local f "x y z"
foreach v of varlist `f' {
        qui count if `v'==0   
        if r(N) >0 {
                gen ln_`v' = ln( 1 + `v' )
                label var ln_`v' "ln(1+`v')"
    }
    else {
        gen ln_`v' = ln( `v' )
        label var ln_`v' "ln(`v')"
     }
        order ln_`v', after( `v' )
}
试试
已有 1 人评分学术水平 热心指数 收起 理由
hiderm + 5 + 5 多谢版主, 思路妙!

总评分: 学术水平 + 5  热心指数 + 5   查看全部评分

9
hiderm 发表于 2013-2-24 00:24:48
dxystata 发表于 2013-2-23 22:42
local f "x y z"
foreach v of varlist `f' {
        qui count if `v'==0
多谢@dxystata 版主支招, 我好好研究研究!

您这招更妙,连sum的结果输出表都省了!

以下是对@dxystata 版主 提供的方案的注释
==================================================
local f "x y z"
foreach v of varlist `f' {
        qui count if `v'==0                    // qui 是quietly的缩写, 意思是不在输出窗口显示计算结果
        if r(N) >0 {                                 // r(N) 返回count命令的结果, 如果局部宏`v'代表的变量含有零值, 则 r(N)>0
                gen ln_`v' = ln( 1 + `v' )
                label var ln_`v' "ln(1+`v')"
    }
    else {
        gen ln_`v' = ln( `v' )
        label var ln_`v' "ln(`v')"
     }
        order ln_`v', after( `v' )
}
===================================================
[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

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

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