Re: [討論] 綠營初選民調分析1
您好,其實分析樣本全距的機率分配不必如此麻煩,
只需把問題說清楚,搭配基本機率論概念即可。
假設有 m 家民調公司針對相同候選人進行支持度調查,
每家公司皆收集 n 份樣本,且抽樣過程為隨機抽樣。
然而,民調公司並不會公佈所有樣本結果,而僅公佈樣本平均值。
您想知道不同公司所公佈的民調數字之間最大差距(全距)的機率分佈為何,
換成機率語言來說,就是求樣本全距的累積分配函數。
令 Xij, i = 1,...,m, j = 1,...,n 為第 i 家公司的第 j 份資料。
為了簡單起見,假設只有一位候選人,民調選項為支持/不支持,且其母體支持度為 p。
因此,每份資料皆服從伯努利分配:Xij ~ Bern(p)。
令每家公司在 n 份資料中所得的總支持數為 Yi = \sum_{j=1}^n Xij,
可知 Yi 服從二項分配:Yi ~ B(n,p)。請注意:這裡的樣本數為 n 而非 m。
然而,任何一家民調公司都不會公佈所有樣本結果,而僅公佈樣本平均值。
定義 Zi = Yi/n 為第 i 家公司公佈的民調數字。
當 n 足夠大時,二項分配可用常態分配近似,代表 Yi ~ N(np,np(1-p))。
簡單計算可知 Zi ~ N(p,p(1-p)/n)。
現令 T = Z(m)-Z(1) 為 m 家公司民調數字的全距,
給定某一固定值 t(例如 2.5%),我們想找出全距 T = t 的機率為何。
分析關鍵在於以下兩點必須同時成立:
(1) 最大值 Z(m) 與最小值 Z(1) 之間的差距必須為 t。
(2) 其餘 m-2 個民調數字必須落在最大最小值之間。
先對 (1) 下手。給定任意值 z,
我們先計算最小值 Z(1) = z 的機率為何,再乘上最大值 Z(m) = z+t 的機率,
如此便可得知 (1) 會發生的機率。
令 f 為 Zi 的機率密度函數,F 為 Zi 的累積分配函數。
m 個民調數字裡最小值 Z(1) = z 的機率為 m*f(z),
而 m-1 個民調數字裡最大值 Z(m) = z+t 的機率為 (m-1)*f(z+t)。
計算 (2) 的機率就很簡單了。
任何民調數字落在最大最小值之間的機率為 F(z+t)-F(z),
代表 m-2 個民調同時落在最大最小值之間的機率為 [F(z+t)-F(z)]^(m-2)。
結合 (1) 和 (2),加上 z 為任意值,
全距 T = t 的機率密度函數為:
g(t) = \int[m*f(z)]*[(m-1)*f(z+t)]*[F(z+t)-F(z)]^(m-2)dz。
對 t 積分,可得全距 T 的累積分配函數:
G(t) = \int[m*f(z)]*[F(z+t)-F(z)]^(m-1)dz。
雖然上式需用數值積分求解,但用任何統計軟體都可輕易計算,
並不需要模擬或是中央極限定理,當然也沒有「對稱性」或「非對稱性」之考量。
以下是一些 Matlab code:
p = 0.35; % 母體支持度
m = 5; % 民調公司家數
n = 3000; % 樣本數
t = 0.025; % 全距
f = @(z) pdf('normal',z,p,sqrt(p*(1-p)/n)); % 各家民調數字之 PDF
F = @(z) cdf('normal',z,p,sqrt(p*(1-p)/n)); % 各家民調數字之 CDF
G = integral(@(z) m*f(z).*(F(z+t)-F(z)).^(m-1),-inf,inf); % 全距之 CDF
G =
0.7485
換句話說,上述結果可表示為:
(A) 候選人母體支持度為 35%
(B) 有 5 家民調公司進行調查
(C) 每家的樣本數為 3000 份
(D) 民調數字之全距小於 2.5%
當 (A), (B), (C), (D) 同時發生時,其可能性為 74.85%。
在相同設定下,底下提供幾張圖作為參考:
(i) 全距之 CDF:https://imgur.com/ywIQv7d

在 (A), (B), (C) 設定下,可看出民調數字之全距不可能超過 5%。
(ii) 母體支持度之影響:https://imgur.com/zKfBl9D

在 (B), (C), (D) 設定下,可看出當母體支持度偏低或偏高時,
全距小於 2.5% 的可能性更高。(因為支持度有其上下界 0 或 1,
靠近邊界時之民調數字自然更集中。)
(iii) 民調公司間數:https://imgur.com/4AS3fdw

在 (A), (C), (D) 設定下,可看出當民調公司間數越多時,
全距小於 2.5% 的可能性越低。(當民調公司間數 m 越多,
滿足 m-2 個民調同時落在最大最小值之間的機率越低。)
(iv) 樣本數:https://imgur.com/TTktGEa

在 (A), (B), (D) 設定下,可看出當樣本數增加時,
全距小於 2.5% 的可能性越高。(樣本數越多估計的越準,
各家民調的數字自然更集中於母體支持度。)
※ 引述《raiderho (冷顏冷雨)》之銘言:
: 原文發在八卦版,與本版主題相關,因此稍作改寫轉來此處。
: 本文屬於檢查模型與抽樣結果的合理性,
: (討論: 若根據客觀公正的抽樣模型,五家民調數字相當一致的可能性多大)
: 沒再橫生枝節討論模型的外部問題
: (不討論抽樣合理性、機構效應,有興趣回頭請移駕到八卦版看相關推文回文)。
: 下一篇我將繼續報告更深入的實驗結果。
: ※ [本文轉錄自 Gossiping 看板 #1T1KJhKc ]
: 作者: raiderho (冷顏冷雨) 看板: Gossiping
: 標題: Re: [新聞] 綠初選民調5家結果超整齊 民調專家當場大笑三聲
: 時間: Sun Jun 16 03:20:07 2019
: 游盈隆可能在民調上確實有經驗,
: 然而,他只有實務經驗,沒有最初等的理論知識。
: 他習慣的是千人初的樣本,
: 將這個經驗直接套入此次各民調機構皆三千人的樣本,
: 對真實情況的推估一定會出錯。
: 三千人樣本標準差大概是千人樣本標準差的六成左右,
: 因此,五個機構的民調數字會比「他認定的民調數字分散程度」集中。
: 不酸游盈隆了,但是還是要回覆一下他質疑的點。還是請出陳水扁吧:
: https://www.ftvnews.com.tw/news/detail/2019614P08M1
: 將陳水扁的觀點具體化,配合民調數字,他的質疑是:
: 每一個候選人在這五家民調支持度全距非常小,
: (陳水扁說法是 2%, 事實上約莫是 2.5%)
: 陳水扁認為這個事件發生的可能性很小,真是如此嗎?
: 先給個簡單結論:
: 在正常的抽樣程序下,
: 「五項機構民調最高最低差距 < 2.5%」的可能性至少有五成 (最低都超過 50.4%),
: 這是大概率事件。
: 想用陰謀論解釋民調結果的人,提點別的論證吧。
: ===
: 正式論證:
: 我們只看 (蔡韓柯) 這組對比結果,因為,同時納入 (蔡韓柯) 與 (賴韓柯)
: 涉及投票行為的策略,需要對模型做更多假設。
: 本篇旨不在此,相關處理留到下一篇。
: (直覺上,兩組投票結果是高度相關的,假設策略性投票的人不多,
: 若一組民調差距有限,另一組的民調差距也有限。)
: 假設三個人的支持度如同民進黨中央給的 (v1, v2, v3)。
: (底下的模型2 可以看到,這個假設其實不重要。)
: 問題:
: 這三個人在五項民調的最高最低差異皆不到 2.5% 的可能性。
: 一次實驗:
: 以 multinomial(3000*5, (v1, v2, v3, 1-v1-v2-v3)) 分配抽出 outcome,
: 若各候選人在5機構3000樣本獲得的最高與最低支持度的差距皆 < 2.5%,
: 稱為 True.
: 可能性:
: 進行一百萬次實驗 (一百萬個平行世界,每個世界都用同樣方式實施民調),
: 計算有多少個 True, 則 可能性 = True / 1000000.
: 模型1: 對稱考量
: 考量五項民調都不低於 (v1-0.0125, v2-0.0125, v3-0.0125),
: 都不高於 (v1+0.0125, v2+0.0125, v3+0.0125), 問可能性為何?
: 實驗跑出來結果約是 0.175
: 模型2: 不對稱考量
: 放鬆考量,五項民調的上下差距不超過 2.5%,
: 不用拘泥於以 (v1, v2, v3) 為中心,這樣的可能性為何?
: 實驗結果大幅提高到 0.571
: 由於模型2 不用拘泥於對稱性,
: 對參數的變化比模型1 更不敏感,
: 暗示著 (v1, v2, v3) 的「確切真實值」不是很重要,
: 模型2 可以避免了模型1 的真實參數估計問題,
: 因此是更穩健的模型。
: 我對模型2 在所有合理參數區間作了測試,發現可能性至少都有 0.504.
: 因此,目前可以初步回答,只看一組民調對比結果,在正常的抽樣程序下,
: 「五項機構民調最高最低差距 < 2.5%」是很可能發生的。
: python code:
: import numpy as np
: diff = 0.025
: v1, v2, v3 = 0.3568, 0.2451, 0.2270
: v4 = 1 - v1 - v2 - v3
: para = np.array([v1, v2, v3, v4])
: lower_bound = np.array([[v1 - diff/2, v2 - diff/2, v3 - diff/2, 0]] * 5)
: upper_bound = np.array([[v1 + diff/2, v2 + diff/2, v3 + diff/2, 1]] * 5)
: round = 1000000
: sample_size = 3000
: agency = 5
: ''' model 1: symmetric '''
: result_1 = 0
: for i in range(round):
: poll = np.random.multinomial(sample_size, para, agency) / sample_size
: q = np.all(np.greater_equal(poll, lower_bound)) *
: np.all(np.less_equal(poll, upper_bound))
: result_1 += q
: prob_1 = result_1 / round # prob_1 is around 0.175
: ''' model 2: asymmetric '''
: result_2 = 0
: for i in range(round):
: poll = np.random.multinomial(sample_size, para, agency) / sample_size
: q = np.all((np.ptp(poll[:,:-1], axis = 0)) < diff)
: result_2 += q
: prob_2 = result_2 / round # prob_2 is around 0.571
: ''' update '''
: 專門測試模型2 合理參數空間中,事件發生最低可能性的程式碼:
: import numpy as np
: import time
: def poll_check(para, diff, round, sample_size, agency):
: result = 0
: for i in range(round):
: poll = np.random.multinomial(sample_size, para, agency) / sample_size
: q = np.all((np.ptp(poll[:,:-1], axis = 0)) < diff)
: result += q
: return result / round
: diff = 0.025
: round = 10000
: sample_size = 3000
: agency = 5
: prob_list = []
: start = time.time()
: for v3 in np.arange(0.2, 0.285, 0.005):
: for v2 in np.arange(v3, 0.335, 0.005):
: for v1 in np.arange(v2, 0.385, 0.005):
: v4 = 1 - v1 - v2 - v3
: para = np.array([v1, v2, v3, v4])
: prob = poll_check(para, diff, round, sample_size, agency)
: prob_list.append(prob)
: end = time.time()
: print(end - start)
: prob_min = min(prob_list) # prob_min is slight above 0.504
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.231.132.80 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1563091047.A.9BB.html
推
07/15 12:42,
6年前
, 1F
07/15 12:42, 1F
→
07/15 12:43,
6年前
, 2F
07/15 12:43, 2F
→
07/15 12:45,
6年前
, 3F
07/15 12:45, 3F
→
07/15 12:46,
6年前
, 4F
07/15 12:46, 4F
→
07/15 12:47,
6年前
, 5F
07/15 12:47, 5F
※ 編輯: Tinderstick (125.231.132.80 臺灣), 07/15/2019 23:19:40