Re: [討論] 綠營初選民調分析1

看板Statistics作者 ( )時間6年前 (2019/07/14 15:57), 6年前編輯推噓1(104)
留言5則, 1人參與, 6年前最新討論串1/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
文章代碼(AID): #1TAk1dcx (Statistics)