1

我有一些代码循环遍历一些嵌套foreach循环中的值以模拟条件求和。不幸的是,这似乎正在创建一个缺失值,我可以通过使用来确认

display `var'

我曾尝试在 Stata 中搜索+=运算符,但没有找到。我也对这种行为感到困惑。我尝试将 10 分配给topTerm而不是 0 以查看变量是否已下限,但事实并非如此。

tempname topTerm bottomTerm controlledContrast
scalar `topTerm' = 0

foreach … numlist {
  foreach … numlist {
    foreach … numlist {
              display `delta', `topTerm'
              scalar `topTerm'= `topTerm' + `delta'*`cc_difference_in_means'*`cc_vet_n'
              display `topTerm'
}}}

编辑:尝试使用本地/全局但仍然缺少值。似乎是范围的问题,虽然我认为本地会解决这个问题,所以我真的很困惑......</p>

请注意,这适用于命令行:

local x = 10
local x = `x' + 10
display `x'
>> 20
4

2 回答 2

2

我只能想象你想要做什么。以下,使用当地人,作品:

local topterm 0
local delta 5
local cc_difference_in_means 10
local cc_vet_n 25

foreach num1 of numlist 1/10 {
        local topterm = `topterm' + `delta' * `cc_difference_in_means' * `cc_vet_n'
        display `topterm'
}

尽管我承认我不使用“本地/全局”以外的任何东西,但以下内容也有效。它类似于您的设置。

tempname topTerm
scalar `topTerm' = 0
disp `topTerm'

foreach num1 of numlist 1/10 {
        scalar `topTerm' = `topTerm' + 5
        display `topTerm'
}

但是您也可以这样做,它会给出相同的(显示的)结果:

scalar topTerm = 0

foreach num1 of numlist 1/10 {  
        scalar topTerm = topTerm + 5
        display topTerm
}

再说一次,我看不出你想要什么。

于 2013-10-30T05:05:44.193 回答
2

@refp16 在这种情况下有一个很好的答案,但你的问题归结为

  1. 我在一系列嵌套循环中对标量求和。
  2. 答案不见了。
  3. 这让我很惊讶。

一般情况下,这里只有“再次查看您的数据和代码”形式的答案是可能的。详细的可以补充的不多,除了

  • Stata 没有+=运营商。考虑到 Stata 对类 C 结构的明显喜爱,这可能是一个惊喜,但在这里并不重要。+=将允许您稍微缩短代码,但不会改变您的问题。

  • 对于一个总和丢失,至少有一个输入到该总和的值丢失是必要的(并且足够的),这反过来又包括(a)它丢失了(b)你做的事情比如采取负数的平方根 (c) 您指的是不存在的东西,Stata 将其评估为缺失。

调试此问题的最佳方法是display添加每个术语并找出缺少的术语。您似乎正在这样做,那么为什么您不能识别缺少的术语?

从长远来看,您知道 Stata 有几种方法可以在没有循环的情况下获得总和,包括summarize, meanonly(将变量的总和留在 as 之后)r(sum),以及sum()可在 Mata 中用于向量和矩阵的函数。

于 2013-10-30T09:00:11.043 回答