看板 Statistics 關於我們 聯絡資訊
原文發在八卦版,與本版主題相關,因此稍作改寫轉來此處。 本文屬於檢查模型與抽樣結果的合理性, (討論: 若根據客觀公正的抽樣模型,五家民調數字相當一致的可能性多大) 沒再橫生枝節討論模型的外部問題 (不討論抽樣合理性、機構效應,有興趣回頭請移駕到八卦版看相關推文回文)。 下一篇我將繼續報告更深入的實驗結果。 ※ [本文轉錄自 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) ※ 轉錄者: raiderho (101.136.218.198 臺灣), 06/17/2019 05:29:39 ※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1560720580.A.A4C.html ※ 編輯: raiderho (114.35.73.213 臺灣), 06/18/2019 07:01:04