【问题标题】:Problem of rewriting a t-test in python in R在R中用python重写t检验的问题
【发布时间】:2021-01-24 02:11:41
【问题描述】:

我想用 R 重写一个 python 代码(实际上是 Jupyter Book)。它是关于计算一些数据的 t 检验函数,然后使用箱线图将其可视化。

我是 Python 和 R 的初学者,但我做了一些尝试。这是python中的代码:

import math
import numpy as np
import pandas as pd
from myst_nb import glue
from scipy.stats import ttest_ind
from matplotlib import pyplot as plt

labels = ['non-failing heart (NF)', 'failing heart (F)']
data = [(99, 52), (96, 40), (100, 38), (105, 18), 
        (np.nan, 11), (np.nan, 5), (np.nan, 42), 
        (np.nan, 55), (np.nan, 53), (np.nan, 39),
        (np.nan, 42), (np.nan, 50)]

df = pd.DataFrame.from_records(data, columns=labels)
tt = ttest_ind(df['non-failing heart (NF)'], 
               df['failing heart (F)'], 
               equal_var=False, nan_policy='omit')

pvalue = tt.pvalue

glue('pvalue', math.ceil(pvalue * 1000.0) / 1000.0)

这是我尝试过的:

library(math)

labels(data) <- c("non-failing heart (NF)", "failing heart (F)")
library(reticulate)
np <- import("numpy", convert=FALSE)
(x <- np$arange(1, 9)$reshape(2L, 2L))
## [[  99.   52.]
##   [  96.   40.]
##   [  100.   38.]
##   [  105.   18.]
##   [ np.nan.   11.]
##   [ np.nan.  5.]
##   [ np.nan.  42.]
##   [ np.nan.  55.]
##   [ np.nan  53.]
##   [ np.nan  39.]
##   [ np.nan.  42.]
##   [ np.nan  50.]
##   [ 23.  24.]]


df = pd.DataFrame.from_records(data, columns=labels)
tt = ttest_ind(df['non-failing heart (NF)'], 
               df['failing heart (F)'], 
               equal_var=False, nan_policy='omit')

pvalue = tt.pvalue
print(pvalue)

【问题讨论】:

  • 你好,你还有一点路要走。就个人而言,如果我用 R 编写,我不会使用 reticulate。供您参考,这是内置的 R t.test 函数rdocumentation.org/packages/stats/versions/3.6.2/topics/t.test
  • @M.Viking 感谢您的帮助,好的,我将按照链接中的示例进行操作,只是一个问题,对于数据如何重写 np.nan 值?它们来自 R 无法提供的 python numpy
  • R 拥有NA 实体。
  • @Parfait 谢谢回复我,你能解释一下吗?您的意思是我可以使用 NA 代替 numpy,如果可以,如何使用?
  • Python 的numpy.nan 的最佳翻译是R 中的NA。实际上,R 对all types 有NA:NA_integer_NA_real_NA_complex_NA_character_ . NA 表示 NA_logical_。由于np.nan 是浮点类型,NA_real_ 可能是最好的版本,但 R 将按照更高的类型顺序进行转换:逻辑 > 整数 > 数字 > 字符 > 因子 > 复数。

标签: python r python-3.x jupyter-notebook


【解决方案1】:

如前所述,t.test 是 R 中 stats 库中的众多内置统计方法之一。因此,只需构建相同的数据框,然后运行测试并根据需要提取测试统计信息。

数据构建 (有些争吵以复制pd.DataFrame.from_records()

labels <- list('non-failing heart (NF)', 'failing heart (F)')

data <- list(c(99, 52), c(96, 40), c(100, 38), c(105, 18), 
             c(NA_integer_, 11), c(NA_integer_, 5), c(NA_integer_, 42), 
             c(NA_integer_, 55), c(NA_integer_, 53), c(NA_integer_, 39),
             c(NA_integer_, 42), c(NA_integer_, 50))

df <- setNames(do.call(rbind.data.frame, 
                       lapply(data, function(d) data.frame(d[1], d[2]))),
              labels)    
df
#    non-failing heart (NF) failing heart (F)
# 1                      99                52
# 2                      96                40
# 3                     100                38
# 4                     105                18
# 5                      NA                11
# 6                      NA                 5
# 7                      NA                42
# 8                      NA                55
# 9                      NA                53
# 10                     NA                39
# 11                     NA                42
# 12                     NA                50

T 检验

results <- t.test(df[['non-failing heart (NF)']], df[['failing heart (F)']])

results
#   Welch Two Sample t-test

# data:  df[["non-failing heart (NF)"]] and df[["failing heart (F)"]]
# t = 12.114, df = 13.43, p-value = 1.311e-08
# alternative hypothesis: true difference in means is not equal to 0
# 95 percent confidence interval:
#  51.73232 74.10101
# sample estimates:
# mean of x mean of y 
# 100.00000  37.08333 
    
results$statistic
#        t 
# 12.11356 

results$estimate
# mean of x mean of y 
# 100.00000  37.08333 

results$p.value
# [1] 1.311125e-08

ceiling(results$p.value * 1000.0)/ 1000.0
# [1] 0.001

【讨论】:

  • 感谢您尝试帮助我以及您所做的出色工作。我尝试使用 RStudio 运行您的代码,但我发现 x 为空。这是漏洞错误:Fehler in var(x) : 'x' ist NULL Zusätzlich: Warnmeldung: In mean.default(x) : argument is not numeric or logical: returning NA
  • 可能是您的实际数据似乎是在尝试在非数字列上运行。在此处发布代码,您的示例数据可以正常工作。见在线演示:rextester.com/IHS73217
猜你喜欢
  • 2015-09-17
  • 1970-01-01
  • 2014-01-27
  • 2013-05-01
  • 1970-01-01
  • 2014-05-30
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多