R 在Stata中创建临时数据集
我正在浏览大量Stata文档,但仍然很难找到一些基本任务的简单示例 一个特别难以理解的问题是如何将某些操作的结果存储在变量中(在编程意义上,不是字段/列),以便我可以将它们相互比较。我不是在谈论统计模型,我可能会使用类似于R 在Stata中创建临时数据集,r,stata,R,Stata,我正在浏览大量Stata文档,但仍然很难找到一些基本任务的简单示例 一个特别难以理解的问题是如何将某些操作的结果存储在变量中(在编程意义上,不是字段/列),以便我可以将它们相互比较。我不是在谈论统计模型,我可能会使用类似于估计值的东西 下面是一个来自R世界的示例,其中我将两个字段的组的平均值存储在相同数量的变量中(同样,在编程意义上): 库(dplyr) category我不是Stata方面的专家(我主要从事python工作,涉猎R),但这段代码应该可以工作collapse类似于R中的group
估计值的东西
下面是一个来自R世界的示例,其中我将两个字段的组的平均值存储在相同数量的变量中(同样,在编程意义上):
库(dplyr)
category我不是Stata方面的专家(我主要从事python工作,涉猎R),但这段代码应该可以工作collapse
类似于R中的groupby
。在折叠数据后,我生成差异变量,然后仅将该变量保留在数据帧中。最后,我将文件保存为temp(并替换cd中名为temp.dta的任何其他文件)
只需一行就可以将结果放入变量(Stata sense)。不重复地显示它也相当容易@Joe Patten的回答很有帮助,但它破坏了当前的数据集
clear
input str1 category first second
a 2 3
a 1 1
a 5 6
b 3 9
b 4 12
b 2 32
c 1 113
c 3 85
c 3 123
end
egen difference = mean(first-second), by(category)
egen tag = tag(category)
list category difference if tag , noobs
tabdisp category, c(difference) format(%4.2f)
结果如下:
. list category difference if tag , noobs
+----------------------+
| category differe~e |
|----------------------|
| a -.6666667 |
| b -14.66667 |
| c -104.6667 |
+----------------------+
. tabdisp category, c(difference) format(%4.2f)
----------------------
category | difference
----------+-----------
a | -0.67
b | -14.67
c | -104.67
----------------------
您要达到的目标可能完全不同,例如使用本地宏或标量或使用Mata。在Stata中有几种方法可以做到这一点,就像在R中一样
至于文档,从[U]开始阅读手册是不可替代的。你可以在谷歌上浪费很多时间,因为互联网上有很多非常有限或零碎的教程。他们大多支持作者的意图,但只有通过系统阅读才能更全面地理解 下面是对@NickCox最干净的解决方案的补充回答:
clear
input str1 category first second
a 2 3
a 1 1
a 5 6
b 3 9
b 4 12
b 2 32
c 1 113
c 3 85
c 3 123
end
bysort category: generate difference = round(abs(sum(first / _N) - sum(second / _N)), .01)
这就是egen
在引擎盖下与其相关的mean()
功能所做的。“手动”执行此操作的优点是,您可以将round()
和abs()
函数组合在一起进行取整,并在一个步骤中分别获取差值的绝对值
然后,您可以显示结果:
bysort category: list difference if _n == _N
-> category = a
+------------+
| difference |
|------------|
3. | .67 |
+------------+
-> category = b
+------------+
| difference |
|------------|
3. | 14.67 |
+------------+
-> category = c
+------------+
| difference |
|------------|
3. | 104.67 |
+------------+
也可以将它们保存在变量中:
bysort category: generate results = difference if _n == _N
这很有帮助,但四舍五入到小数的倍数并不是一种特别好的近似显示格式的方法。现在在中直接讨论了这一点,但这是因为大多数十进制分数(0.1、0.01、0.001等的倍数)不能精确地用二进制表示。我同意,但根据用例的不同,它通常是一个非常合适的近似值。我对文档并不陌生。在我看来,数百页的命令只是拼图的一部分,但肯定不应该被视为完整的。根据我的阅读,Stata手册缺乏任何形式的流程,并且无法提供上下文,这使得“天真”的人通常无法访问它们。奇怪的是,这就是我对R文档的印象。“官方”Stata文件约10000页;这是一种很难知道哪100。。。200 ... 500 ... 每个人最需要的1000页以及顺序。Muenchen和Hilbe为Stata用户写了一本关于R的书。相反的那本书更难想象,当然也不在我的待办事项清单上,尽管我已经尽力解释了其中的一些细节。本质上,Stata不是一种编程语言,而是一种可编程的统计程序,任何想要其他东西的人最多都会感到困惑。Mata更像是主流编程语言(尽管在编程中,主流总是奇怪地出现在观察者的位置)。我不同意。Stata的ado
语言是一种编程语言。但这不是一个一般的统计数据。它本质上不是面向对象的,这并不意味着它不是一种编程语言Mata本质上是面向对象的,但它是一种矩阵语言,不是一种通用的编程语言。@Pearly Spencer相同的信息,不同的边界。我发现人们总能想出一些标准,使Stata不是一种编程语言。它总是有更好的语言来表达的。
bysort category: list difference if _n == _N
-> category = a
+------------+
| difference |
|------------|
3. | .67 |
+------------+
-> category = b
+------------+
| difference |
|------------|
3. | 14.67 |
+------------+
-> category = c
+------------+
| difference |
|------------|
3. | 104.67 |
+------------+
bysort category: generate results = difference if _n == _N