【问题标题】:How to plot a matrix of p-values into a histogram如何将 p 值矩阵绘制成直方图
【发布时间】:2016-02-04 14:51:24
【问题描述】:

我一直在网上搜索如何绘制存储在矩阵中的值的直方图,但我在这样做时遇到了一些麻烦。我创建了一个forval 循环,我在其中存储了 1000 次测试试验的 p 值,现在我想在直方图上绘制这些 p 值。

/* Loop generating 1000 trials and storing p-values */

mata: pvalue1000 = J(1000,1,.)

forvalues i = 1/1000 {

    clear
    quiet set obs 1000
    gen n = _n
    quiet gen A = runiform()
    quiet ttest A = 0.20

    /*store the mean, in a local variable*/
    local pvalue = r(p)
    gen pval = r(p)

    /*transfer the p-value from the "local" to the matrix */
    mata: pvalue1000[`i',1] = `pvalue'
}

mata: pvalue1000
hist pvalue1000

在这种情况下,hist pvalue1000 表示找不到 pvalue1000,当我尝试执行 hist pval 时,它只在直方图中显示一个 p 值(我假设这是因为它是循环外)。

另请注意,矩阵仅存储 p 值,所有 p 值都存储在单个列(有 1000 行)中。所以矩阵大小为 1 列和 1000 行。

那么我怎样才能用hist 调用一个变量,它将在该直方图上绘制所有p 值?

【问题讨论】:

    标签: matrix histogram stata p-value


    【解决方案1】:

    histogram 需要一个变量名,而你首先要给它一个矩阵名,所以不要去那里,因为矩阵和变量在 Stata 中完全不同。

    相反,当你给它一个变量名时,你的变量pval 只包含放入其中的单个和最后一个 P-值,因为 pval 之前的所有化身都是 @987654324用你自己的代码@ed。 (将直方图命令 inside 在这里没有用处,因为一次最多只有一个 P-value 在变量内。)

    矩阵可能非常有用,但它们充其量只是间接用于此目的。

    大概你的问题不是你真正的问题。如果您在 (0, 1) 上从制服中获得大小为 1000 的样本,则样本均值将全部接近 0.5,并且平均值为 0.2 的测试的 P 值实际上都无法区分从 0 开始,没有任何直方图是有趣或有用的。但是这段代码似乎抓住了你的意图:

    clear 
    set obs 1000 
    gen A = . 
    gen pval = . 
    
    quietly forval i = 1/1000 {
        replace A = runiform()
        ttest A = 0.20
        replace pval = r(p) in `i' 
    }
    
    hist pval 
    

    这段代码中没有的内容:

    1. 出于任何目的都不需要将结果放入局部变量和/或矩阵中和/或再次取出它们。我们直接将它们一一放入变量中,因为那是需要的结果。

    2. 观察号_n 不用于任何事情,因此它们似乎也是可有可无的,尽管自然可能需要它们来解决您的实际问题。

    3. 您的评论 store the mean 与您尝试的任何代码都不匹配。

    另请注意,将locals 作为变量讨论对于任何熟悉其他编程语言的人来说都是很自然的,但绝不是 Stata 术语。局部变量是局部宏,而不是变量。

    【讨论】:

    • 太棒了,感谢您的解释。我熟悉许多编程语言,但我是 STATA 的新手,还在弄清楚它是如何工作的,所以你的回复非常有用!
    【解决方案2】:

    Stata 的主要数据集,您使用matrix 命令访问的矩阵和 Mata 矩阵都分开存在,需要单独的函数来处理,但您可以在这三个之间传输数据。

    在您的情况下,您希望将 Mata 矩阵加载到 Stata 数据集中,您可以执行以下操作:

    clear
    getmata pvalue1000, double
    

    请注意您的 p 值非常小,因此您需要使用 double 选项。否则你会得到单精度的零。

    【讨论】:

    • 所以我做 getmata pvalue,在 for 循环之后加倍?
    • 是的;如果您遵循这条路线,那么getmata 将遵循所有其他路线。但请注意,(数字上)double 将是徒劳的,因为您已经通过将值放在local 中而失去了精度,double 不会恢复它。我建议(从统计上)将 P 值视为值得双精度是荒谬的。
    • @Nick Cox,我没有查看这里测试的内容 - 我认为这可能只是一个示例,但如果我运行原始代码,那么在 mata 中收集的值具有双精度,所以宏似乎并没有失去精度......如果我省略了双选项,那么所有 p 值在保存到 Stata 时都会变为零。但我想你是对的,实际问题并不重要。
    • 局部变量的精度低于标量。这通常不会咬人,但这是真的;原因是在本地宏中放入一些东西会使它成为一个字符串。
    • 原则上,字符串可以保持任意精度。我刚刚测试过,当地人完全保持双重状态精度。尝试生成一个具有足够多有效数字的双变量,将其保存到本地,然后返回到 Stata。然后就可以断言原变量和新变量是一样的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多