Статистика Excel: Как рассчитать p-значение таблицы сопряженности 2x2? - PullRequest
0 голосов
/ 24 марта 2020

Приведенные данные, такие как:

        A         B           C
1               Group 1     Group 2
2   Property 1     56         651
3   Property 2     97       1,380

, как можно рассчитать значение p (т. Е. Вероятность «правого хвоста» распределения хи-квадрат) напрямую, без настройки отдельного вычисления для ожидаемых значений таблицы?

Значение p вычисляется в Excel функцией ChiSq.dist.RT , если известно значение хи-квадрат для таблицы или * 1009. * если вам известна таблица «ожидаемых значений» для таблицы . Значение хи-квадрат вычисляется с использованием ожидаемых значений, а ожидаемые значения рассчитываются из исходной таблицы по несколько сложной формуле, поэтому в любом случае Excel требует, чтобы мы сами рассчитали ожидаемые значения, чтобы получить значение р Кажется глупым. Итак, как я могу получить p-значение в Excel, не вычисляя ожидаемые значения отдельно?

Редактировать: Этот вопрос был изначально опубликован с заголовком «Как рассчитать коэффициент корреляции Пирсона с массивами из 2 свойств?» и спросил, почему функция Pearson дает неправильный ответ. Что ж, ответом на это было то, что я путал значение p с коэффициентом корреляции Пирсона, а это разные вещи. Поэтому я переформулировал вопрос, чтобы спросить, что мне действительно нужно было знать, и публикую ответ. Я подожду некоторое время, прежде чем принять собственный ответ, если у кого-то другой получится лучше.

1 Ответ

0 голосов
/ 28 марта 2020

Мне кажется, что для этого требуется VBA. Я написал следующую функцию VBA для вычисления хи-квадрат или значения p, а также две другие меры связи для таблицы сопряженности 2x2:

Public Function nStatAssoc_2x2(sType As String, nGrp1PropCounts As Range, nGrp2PropCounts As Range) As Single

' Return one of several measures of statistical association of a 2×2 contingency table:
'                   Property 1      Property 2
'       Group 1     nCount(1, 1)    nCount(1, 2)
'       Group 2     nCount(2, 1)    nCount(2, 2)

' sType is:     to calculate:
'   "OR"        Odds ratio
'   "phi"       Phi coefficient
'   "chi-sq"    Chi-squared
'   "p"         p-value, i.e., right-tailed probability of the chi-squared distribution

' nGrp<n>PropCounts is a range of two cells containing the number of members of group n that have each of two properties.
' These arguments are 1-D arrays in order to allow the data to appear in non-adjacent ranges in the spreadsheet.

' References:
    ' Contingency table:        https://en.wikipedia.org/wiki/Contingency_table
    ' Measure of association:   www.britannica.com/topic/measure-of-association
    ' Odds ratio:               https://en.wikipedia.org/wiki/Odds_ratio
    '                           https://en.wikipedia.org/wiki/Effect_size#Odds_ratio
    ' Phi coefficient:          https://en.wikipedia.org/wiki/Phi_coefficient
    ' Chi-sq:                   https://en.wikipedia.org/wiki/Pearson's_chi-squared_test#Calculating_the_test-statistic
    '                           www.mathsisfun.com/data/chi-square-test.html
    '                               Shows calculation of expected values.
    ' p-value:                  https://docs.microsoft.com/en-us/office/vba/api/excel.worksheetfunction.ChiSq_Dist_RT

Dim nCount(1 To 2, 1 To 2) As Integer
Dim nSumGrp(1 To 2) As Integer, nSumProp(1 To 2) As Integer, nSumAll As Integer
Dim nExpect(1 To 2, 1 To 2) As Single
Dim nIndex1 As Byte, nIndex2 As Byte
Dim nRetVal As Single

' Combine input arguments into contingency table:
For nIndex1 = 1 To 2
    nCount(1, nIndex1) = nGrp1PropCounts(nIndex1)
    nCount(2, nIndex1) = nGrp2PropCounts(nIndex1)
  Next nIndex1

' Calculate totals of group counts, property counts, and all counts (used for phi and chi-sq):
For nIndex1 = 1 To 2
    For nIndex2 = 1 To 2
        nSumGrp(nIndex1) = nSumGrp(nIndex1) + nCount(nIndex1, nIndex2)
        nSumProp(nIndex2) = nSumProp(nIndex2) + nCount(nIndex1, nIndex2)
      Next nIndex2
  Next nIndex1
nSumAll = nSumGrp(1) + nSumGrp(2)

If nSumAll <> nSumProp(1) + nSumProp(2) Then
    nRetVal = -2           ' Error: Sums differ.
    GoTo Finished
  End If

Select Case sType

    ' Odds ratio
    Case "OR":
        nRetVal = (nCount(1, 1) / nCount(1, 2)) / (nCount(2, 1) / nCount(2, 2))
        If nRetVal <> (nCount(1, 1) / nCount(2, 1)) / (nCount(1, 2) / nCount(2, 2)) Then
            nRetVal = -3            ' Error: OR calculation results differ.
            GoTo Finished
          End If

    ' Phi coefficient
    Case "phi":
        nRetVal = ((CLng(nCount(1, 1)) * nCount(2, 2)) - (CLng(nCount(1, 2)) * nCount(2, 1))) / _
                    (CSng(nSumGrp(1)) * nSumGrp(2) * nSumProp(1) * nSumProp(2)) ^ 0.5

    ' Chi-squared
    Case "chi-sq", "p":     ' For "p", nRetVal is passed to the next select case statement.
        ' Calculate table of expected values:
        For nIndex1 = 1 To 2
            For nIndex2 = 1 To 2
                    ' In next line, the division is done first to prevent integer overflow,
                    '   which can happen if the multiplication is done first.
                nExpect(nIndex1, nIndex2) = nSumGrp(nIndex1) / nSumAll * nSumProp(nIndex2)
                If nExpect(nIndex1, nIndex2) < 5 Then
                    ' https://en.wikipedia.org/wiki/Pearson's_chi-squared_test#Assumptions
                    nRetVal = -4        ' Error: Expected value too small.
                    GoTo Finished
                  Else
                    nRetVal = nRetVal + _
                        (nCount(nIndex1, nIndex2) - nExpect(nIndex1, nIndex2)) ^ 2 / nExpect(nIndex1, nIndex2)
                  End If
              Next nIndex2
          Next nIndex1

    Case Else:
        nRetVal = -1           ' Error: Invalid measure type.
        GoTo Finished
  End Select

Select Case sType
    Case "OR", "phi", "chi-sq":

    ' p-value       ' Uses value of nRetVal passed from the previous select case statement.
    Case "p": nRetVal = WorksheetFunction.ChiSq_Dist_RT(nRetVal, 1)
  End Select

Finished: nStatAssoc_2x2 = nRetVal

End Function        ' nStatAssoc_2x2()

Функция протестирована в Excel 2019 и дает правильные значения для всех четырех мер для нескольких тестовых таблиц. Критика или предложения по улучшению кода приветствуются.

Если я ошибаюсь, и для этого не требуется VBA или по какой-либо другой причине, есть лучший способ сделать это, пожалуйста, отправьте другой ответ с этим , Как я сказал в примечании к редактированию в своем вопросе, я подожду некоторое время, прежде чем принять свой ответ, чтобы узнать, есть ли у кого-то еще лучший ответ.

...