Stata 如果本周缺少值,如何将其替换为前一周的值?

Stata 如果本周缺少值,如何将其替换为前一周的值?,stata,Stata,我有一个数据集,显示了在特定的一周和特定的商店中,每个产品类别支付了多少(“cenoz”-美分/盎司) clear set more off input week store cenoz category 1 1 2 1 1 1 4 2 1 1 3 3 1 2 5 1

我有一个数据集,显示了在特定的一周和特定的商店中,每个产品类别支付了多少(“
cenoz
”-美分/盎司)

clear
set more off
input week  store   cenoz   category
        1      1      2         1
        1      1      4         2
        1      1      3         3
        1      2      5         1
        1      2      7         2
        1      2      8         3
        2      1      4         1
        2      1      1         2
        2      1      10        3
        2      2      3         1
        2      2      4         2
        2      2      7         3
        3      1      5         1
        3      1      3         2
        3      2      5         1
        3      2      4         2
end    
我创建了一个新变量
cenoz3
,该变量指示给定特定周和商店的类别3的平均支付金额。与cenoz1和cenoz2相同

egen cenoz1 = mean(cenoz/ (category == 1)), by(week store) 
egen cenoz2 = mean(cenoz/ (category == 2)), by(week store) 
egen cenoz3 = mean(cenoz/ (category == 3)), by(week store) 
结果表明,在第3周,3类商品在任何一家商店(1和2)都没有售出。因此,将生成缺少的值

week    store   cenoz   category    cenoz1  cenoz2  cenoz3
  1       1       2        1           2       4      3
  1       1       4        2           2       4      3
  1       1       3        3           2       4      3
  1       2       5        1           5       7      8
  1       2       7        2           5       7      8
  1       2       8        3           5       7      8
  2       1       4        1           4       1      10
  2       1       1        2           4       1      10
  2       1       10       3           4       1      10
  2       2       3        1           3       4      7
  2       2       4        2           3       4      7
  2       2       7        3           3       4      7
  3       1       5        1           5       3      .
  3       1       3        2           5       3      .
  3       2       5        1           5       4      .
  3       2       4        2           5       4      .
我想用前一周的值和匹配存储区的值替换特定周丢失的值。也就是说:

replace missing values for category 3 in week 3 in store 1 
           with values for category 3 in week 2 in store 1

我可以使用命令
replace
吗?还是更复杂的命令

比如:

replace cenoz1 = cenoz1[_n-1] if missing(cenoz1) 
但我还需要匹配门店,而不仅仅是时间变量
week

我在网站上找到了Nicholas Cox提供的代码 :

你认为呢

 by store (week), sort: cenoz1 = cenoz1[_n-1] if missing(cenoz1) 
足够了吗

更新

当我使用代码时

by store (week category), sort: replace cenoz3 = cenoz3[_n-1] if missing(cenoz3) 
似乎它提供了正确的价值观:

week    store   cenoz   category    cenoz1  cenoz2  cenoz3
  1       1       2        1           2       4      3
  1       1       4        2           2       4      3
  1       1       3        3           2       4      3
  1       2       5        1           5       7      8
  1       2       7        2           5       7      8
  1       2       8        3           5       7      8
  2       1       4        1           4       1      10
  2       1       1        2           4       1      10
  2       1       10       3           4       1      10
  2       2       3        1           3       4      7
  2       2       4        2           3       4      7
  2       2       7        3           3       4      7
  3       1       5        1           5       3      10
  3       1       3        2           5       3      10
  3       2       5        1           5       4      7
  3       2       4        2           5       4      7
鉴于我的数据集相当大,有没有办法对这段代码进行双重检查


如果找到一个缺少vaues的代码,如何使该代码不那么具体,而是适用于任何缺少的
cenoz
<代码>(cenoz1、cenoz2、cenoz3、cenoz4…cenoz12)

如果您想对同一商店和同一类别使用以前的信息,应该

by store category (week), sort: replace cenoz3 = cenoz3[_n-1] if missing(cenoz3) 
一个概括可以是

sort store category week 
forval j = 1/12 { 
    by store category: replace cenoz`j' = cenoz`j'[_n-1] if missing(cenoz`j') 
} 

然而,这种结转是一种相当粗糙的插值方法。考虑线性、三次、三次样条、PSPIC插值方法。使用
search
查找Stata程序

关于为什么要使用代码的简要说明

by store (category week), sort: replace cenoz3 = cenoz3[_n-1] if missing(cenoz3)
不行

它适用于您给出的示例数据集。但稍微修改一下可能会产生意想不到的结果。考虑下面的例子:

clear all
set more off

input week  store   cenoz   category
        1      1      2         1
        1      1      4         2 /* 
        1      1      3         3 deleted observation */
        1      2      5         1
        1      2      7         2
        1      2      8         3
        2      1      4         1
        2      1      1         2
        2      1      10        3
        2      2      3         1
        2      2      4         2
        2      2      7         3
        3      1      5         1
        3      1      3         2
        3      1    999          3 // new observation
        3      2      5         1
        3      2      4         2
end 

egen cenoz1 = mean(cenoz/ (category == 1)), by(week store) 
egen cenoz2 = mean(cenoz/ (category == 2)), by(week store) 
egen cenoz3 = mean(cenoz/ (category == 3)), by(week store) 

order store category week
sort store category week
list, sepby(store category)

*----- method 1 (your code) -----

gen cenoz3x1 = cenoz3
by store (category week), sort: replace cenoz3x1 = cenoz3x1[_n-1] if missing(cenoz3x1) 

*----- method 2 (Nick's code) -----

gen cenoz3x2 = cenoz3
by store category (week), sort: replace cenoz3x2 = cenoz3x2[_n-1] if missing(cenoz3x2) 

list, sepby(store category)
方法1将第1类物品的价格分配给第2类物品(cenoz3x1的观察4)。大概是你不想要的东西。如果您想避免这种情况,那么组应该基于
商店类别
,而不仅仅是
商店


开始阅读的最佳位置是
帮助
和手册。

是的,您可能可以在解决方案中的某个位置包含
替换
。你具体试过什么?另一方面,您的
egen,mean()
s不是计算方法。我的意思是,他们是,但对于
周店
组只进行了一次观察。这是示例数据的一个特性,还是真实数据库的特性?这是您想要的吗?我的数据集有97000个观察值,因此每周存储组都有属于同一类别的多个观察值。我只是不想让示例太长。请查看文章末尾的更新。您希望
store
s和
categor
ies匹配,因此我相信您遗漏了一些东西(但几乎就在那里)。你没有试过自己的代码来看看它是否足够吗?试试看,看看结果。如果您有任何问题,请更新您的问题。您需要在上一个语句中使用
replace
。Nick,我试图在BY/SORT命令中查找有关变量顺序的信息,但无法找到。以下代码是否生成相同的信息:按门店类别(周),排序:如果缺失,则替换cenoz3=cenoz3[\n-1](周),如果缺失,则按门店类别(周),排序:如果缺失,则替换cenoz3=cenoz3[\n-1](周)?括号里是什么?你能指出一个来源吗?在那里我可以读到当我们改变变量的不同组合的出现顺序时会发生什么?在此上下文中关于括号的附加信息也将非常有用。这些语句是等价的。括号在<代码>的帮助中解释为,您应该从这里开始阅读。如果你的搜索策略是从谷歌开始的,那是很常见的,但是方法不对。考虑一个简单的例子,代码< > Foo>代码>值>代码>蛙蟾蜍和<代码> bar >代码>值>代码>红黑< /代码>。然后,
bar-foo
的交叉组合就是
“红青蛙”“红蟾蜍”“黑青蛙”“黑蟾蜍”
,而
foo-bar
的交叉组合是相同的,但顺序不同。因此,组的顺序只是顺序问题,而不是定义问题。但是在小组中,观察的顺序可能很重要,就像这个问题一样,当你使用以前的值时。你好,尼克。你对我发帖的回复非常有效。然而,并非所有观察结果都被前一周/商店/类别的值所取代。我想这可能是因为没有前一周的资料可供参考,但事实并非如此。很抱歉我的回答被耽搁了:我一直在同时处理几个项目。你好,罗伯托,对不起,我忘了跟进。谢谢你的反馈。在你发布之后,我运行了几次代码,两个代码都为我生成了相同的结果。不客气。我不确定你是否引用了我在文章中描述的两种“方法”,但如果你引用了,这个例子的目的是显示它们将给出不同的结果,即使在某些特定的应用程序中它们没有。不清楚尼克的解决方案是否适合你。我想是的。如果是这样,考虑“接受”他的回答。罗伯托,谢谢,我明白你的意思。我还为尼克的反馈添加了评论。
by store (category week), sort: replace cenoz3 = cenoz3[_n-1] if missing(cenoz3)
clear all
set more off

input week  store   cenoz   category
        1      1      2         1
        1      1      4         2 /* 
        1      1      3         3 deleted observation */
        1      2      5         1
        1      2      7         2
        1      2      8         3
        2      1      4         1
        2      1      1         2
        2      1      10        3
        2      2      3         1
        2      2      4         2
        2      2      7         3
        3      1      5         1
        3      1      3         2
        3      1    999          3 // new observation
        3      2      5         1
        3      2      4         2
end 

egen cenoz1 = mean(cenoz/ (category == 1)), by(week store) 
egen cenoz2 = mean(cenoz/ (category == 2)), by(week store) 
egen cenoz3 = mean(cenoz/ (category == 3)), by(week store) 

order store category week
sort store category week
list, sepby(store category)

*----- method 1 (your code) -----

gen cenoz3x1 = cenoz3
by store (category week), sort: replace cenoz3x1 = cenoz3x1[_n-1] if missing(cenoz3x1) 

*----- method 2 (Nick's code) -----

gen cenoz3x2 = cenoz3
by store category (week), sort: replace cenoz3x2 = cenoz3x2[_n-1] if missing(cenoz3x2) 

list, sepby(store category)