在Julia中,我想测试在dataframe的另一列中定义的每个组的变量的正态性。
让我们说:
df = DataFrame(x = rand(Normal(),30), group = repeat(["A", "B"],15))我知道我可以用以下方法测试x的正态性:
using HypothesisTests
using Distributions
OneSampleADTest(x, Normal())所以问题是如何检验x对每个组的正态性?在R中,我会使用tapply(),但我在Julia中找不到相应的.
发布于 2022-09-09 20:22:55
这取决于您期望的输出。我建议您将结果存储在数据框架中(这不是tapply所做的):
julia> gdf = groupby(df, :group, sort=true) # group by :group and keep groups sorted
GroupedDataFrame with 2 groups based on key: group
First Group (15 rows): group = "A"
Row │ x group
│ Float64 String
─────┼───────────────────
1 │ -0.869008 A
2 │ 0.190041 A
3 │ 0.369881 A
4 │ 0.445092 A
⋮ │ ⋮ ⋮
13 │ -0.599266 A
14 │ 0.696132 A
15 │ 0.788465 A
8 rows omitted
⋮
Last Group (15 rows): group = "B"
Row │ x group
│ Float64 String
─────┼───────────────────
1 │ -1.19973 B
2 │ 0.557241 B
3 │ -0.425667 B
4 │ 0.787917 B
⋮ │ ⋮ ⋮
13 │ 1.96912 B
14 │ 0.567594 B
15 │ 1.39739 B
8 rows omitted
julia> res = combine(gdf, :x => (x -> OneSampleADTest(x, Normal())) => :ADTest)
2×2 DataFrame
Row │ group ADTest
│ String OneSampl…
─────┼───────────────────────────────────────────
1 │ A One sample Anderson-Darling test…
2 │ B One sample Anderson-Darling test…现在,在res中,您有了组名和测试结果(一个完整的测试结果对象,您可以在以后使用)。
如果您只对p值感兴趣,请执行以下操作:
julia> res = combine(gdf, :x => (x -> pvalue(OneSampleADTest(x, Normal()))) => :ADTest_pvalue)
2×2 DataFrame
Row │ group ADTest_pvalue
│ String Float64
─────┼───────────────────────
1 │ A 0.469626
2 │ B 0.750134如果您习惯使用dplyr样式,请使用DataFramesMeta.jl:
julia> using DataFramesMeta
julia> @combine(gdf, :ADTest = OneSampleADTest(:x, Normal()))
2×2 DataFrame
Row │ group ADTest
│ String OneSampl…
─────┼───────────────────────────────────────────
1 │ A One sample Anderson-Darling test…
2 │ B One sample Anderson-Darling test…
julia> @combine(gdf, :ADTest_pvalue = pvalue(OneSampleADTest(:x, Normal())))
2×2 DataFrame
Row │ group ADTest_pvalue
│ String Float64
─────┼───────────────────────
1 │ A 0.469626
2 │ B 0.750134发布于 2022-09-09 20:23:32
如果您只想为数据帧中的每个组获取pvalue,
julia> combine(groupby(df, :group), :x => (x -> pvalue(OneSampleADTest(x, Normal()))) => :onesampleAD_pvalue)
2×2 DataFrame
Row │ group onesampleAD_pvalue
│ String Float64
─────┼────────────────────────────
1 │ A 0.275653
2 │ B 0.544317如果您想要打印每个组的测试细节(或进行更复杂的操作),您也可以循环遍历组:
julia> for (key, sdf) in pairs(groupby(df, :group))
println("Group $(key.group)")
display(OneSampleADTest(sdf.x, Normal()))
end
Group A
One sample Anderson-Darling test
--------------------------------
...
Group B
One sample Anderson-Darling test
--------------------------------
...https://stackoverflow.com/questions/73666985
复制相似问题