【问题标题】:Julia language: Redirecting stdout does not affect every println // How to extract value from stdoutJulia 语言:重定向标准输出不会影响每个 println // 如何从标准输出中提取值
【发布时间】:2019-10-20 15:54:59
【问题描述】:

我最初的目标是进行测试并获得 pvalue。 我使用了OneSampleTTest,它看起来很有希望,但结果最终出现在标准输出中,如下所示:

julia> OneSampleTTest([1,2,3,4,5],3.1)
One sample t-test
-----------------
Population details:
    parameter of interest:   Mean
    value under h_0:         3.1
    point estimate:          3.0
    95% confidence interval: (1.0368, 4.9632)

Test summary:
    outcome with 95% confidence: fail to reject h_0
    two-sided p-value:           0.8944

Details:
    number of observations:   5
    t-statistic:              -0.14142135623730961
    degrees of freedom:       4
    empirical standard error: 0.7071067811865476

我想获取这个值:

two-sided p-value: 0.8944

为了重定向标准输出,我在我们的网站上找到了this。但似乎 OneSampleTTest 的输出不受此影响。

julia> using HypothesisTests

julia> original_stdout = stdout
Base.TTY(RawFD(0x0000001b) open, 0 bytes waiting)

julia> (rd, wr) = redirect_stdout()
(Base.PipeEndpoint(RawFD(0x00000020) open, 0 bytes waiting), Base.PipeEndpoint(RawFD(0x00000025) open, 0 bytes waiting))

julia> println("test")

julia> s = readline(rd)
"test"

julia> s == "test"
true

julia> OneSampleTTest([1,2,3,4,5],3.1)
One sample t-test
-----------------
Population details:
    parameter of interest:   Mean
    value under h_0:         3.1
    point estimate:          3.0
    95% confidence interval: (1.0368, 4.9632)

Test summary:
    outcome with 95% confidence: fail to reject h_0
    two-sided p-value:           0.8944

Details:
    number of observations:   5
    t-statistic:              -0.14142135623730961
    degrees of freedom:       4
    empirical standard error: 0.7071067811865476


julia> 

如果有另一个s = readline(rd) 它会卡住,因为 rd 中没有任何内容。 (我假设)

解决此问题的唯一其他想法是尝试将测试结果写入文件并再次解析该文件。但我想进行数百万次 t 检验并使用文件来存储结果并每次都重新读取它们,这听起来像是一项糟糕的性能工作。

【问题讨论】:

    标签: julia stdout p-value t-test


    【解决方案1】:

    我建议相信 Julia 和您的操作系统可以快速执行此类操作,并且仅在遇到瓶颈后尝试优化。

    以下代码将 p 值作为 字符串 打印到文本文件中,无需任何类型的标准输出重定向,而且速度很快。一百万次迭代需要 2.5 秒

     open("pvalues.txt","w") do io
        for i in 1:1000000 
    
            # do the test
            test = might be a better place.OneSampleTTest(rand(Int64,5),3.1)
    
            # transform only the pvalue of the test to a string an write it
            # take note of the function "pvalue", which extract, well, the p-value!
            write(io,string(pvalue(test),"\n"))
    
        end
    end
    

    您也可以将您的讨论带到https://discourse.julialang.org/,以了解您处理数据的整体方法是否可以改进。

    【讨论】:

      【解决方案2】:

      OneSampleTTest 的调用实际上打印任何东西。如果你在行尾加分号,你会看到没有输出显示。

      julia> OneSampleTTest([1,2,3,4,5],3.1);
      
      julia>
      

      OneSampleTTest() 所做的是返回一个 OneSampleTTest 类型的值。它甚至不做测试,只是创建一个测试对象。由于您没有在末尾添加分号,因此 Julia 将调用方法 Base.show 将有关此值的信息文本写入当前输出流。 OneSampleTTestHypothesisTest 的子类型,它扩展了 Base.show 方法以写入您在控制台上看到的输出。

      如果您出于某种原因需要存储show 的输出,您可以使用Base.repr,它将show 的输出作为String 提供。

      julia> result = repr(OneSampleTTest([1,2,3,4,5],3.1));
      
      julia> result
      "One sample t-test\n-----------------\nPopulation details:\n    parameter of interest:   Mean\n    value under h_0:         3.1\n    point estimate:          3.0\n    95% confidence interval: (1.0368, 4.9632)\n\nTest summary:\n    outcome with 95% confidence: fail to reject h_0\n    two-sided p-value:           0.8944\n\nDetails:\n    number of observations:   5\n    t-statistic:              -0.14142135623730961\n    degrees of freedom:       4\n    empirical standard error: 0.7071067811865476\n"
      

      请注意,您不需要通过解析文本来提取p值。 OneSampleTTest 实现 pvalue 方法,只需在测试对象上使用 pvalue 即可计算并返回 p 值。

      julia> test = OneSampleTTest([1,2,3,4,5],3.1); # this only creates an object, does not compute p-value
      
      julia> pvalue(test) # computes and `show`s the value
      

      【讨论】:

      • 很好的答案!不仅纠正了我的错误假设,即 println 正在进行以及如何获取相反返回的对象的字符串表示形式,而且还为我指出了调用 pvalue(test) 的简单解决方案非常有帮助。我觉得“OneSampleTTest”的文档可能已经给出了一些如何从其结果中提取所有相关内容的示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2011-12-08
      相关资源
      最近更新 更多