Ero sivun ”Koronavirus” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
 
(15 välissä olevaa versiota samalta käyttäjältä ei näytetä)
Rivi 2: Rivi 2:
'''Koronavirus''' käsittelee SARS-COV-2-viruksen ja sen aiheuttaman COVID-19-taudin olennaisia piirteitä.
'''Koronavirus''' käsittelee SARS-COV-2-viruksen ja sen aiheuttaman COVID-19-taudin olennaisia piirteitä.


== Laskenta ==
== Perustelut ==


=== Piirrä näkemysverkko Kialon koronakeskustelusta ===
=== Linkkejä ===


[[File:Koronakideargumentaatio.png|600px|thumb|Argumentaatio koskien koronarokotusten pakollisuutta.]]Koronakide-hankkeeseen liittyen tehdään näkemysverkkoja koronarokotusten argumentaatiosta.
* [http://77.86.191.32/rtools_server/runs/covid_cases_cities.pdf Koviditapaukset kaupungeittain viikon keskiarvo]
* [http://77.86.191.32/rtools_server/runs/covid_cases_cities_daily.pdf Koviditapaukset kaupungeittain ja päivittäin]
* [http://77.86.191.32/rtools_server/runs/Sade-ennusteen_muutos.png Sade-ennusteen muutos (ei liity koronaan)]


Laskennan logiikka on seuraava. Alkuperäiseen väitteeseen A kohdistuu argumentti B ja tähän kohdistuu argumentti C eli C → B → A. Prioritodennäköisyys, että A on totta eli A+ on P(A), kun meillä ei ole muuta tietoa. Kun lisätään argumentti B, saadaan Bayesin kaavalla
=== Data ===


P(A|B) = P(B|A)P(A)/P(B).
Keskusteluja koronaviruksesta ja kovidista Kialo-alustalla, esim. [https://www.kialo.com/will-the-covid-19-pandemic-have-a-lasting-impact-on-society-34267 Onko kovidipandemialla pysyviä vaikutuksia yhteiskuntaan?]. Alla olevassa tiedostossa on 15 keskustelua aihepiiristä. Toisessa tiedostossa on Kialon ilmastokeskusteluja.


Vastaava kaava saadaan todennäköisyydelle että A ei tapahdu eli A- jolloin P(A-) = 1-P(A+). Sama voidaan merkitä jos P(A) = p niin vastaava vedonlyöntisuhde (odds) on O(A) = q = p/(1-p) ja p = q/(q+1). Tällöin voidaan laskea vedonlyöntisuhde
* {{#l:Covid-19_discussions.zip}}
* {{#l:climate_discussions.zip}}


P(A+|B) / P(A-|B) = P(B|A+)P(A+)/P(B) / (P(B|A-)P(A-)/P(B))
=== Näkemysverkko Kialon koronakeskustelusta ===
O(A|B) = P(B|A+)/P(B|A-) O(A).


Yhtälössä esiintyvää termiä P(B|A+)/P(B|A-) kutsutaan myös Bayes-tekijäksi tai -faktoriksi F eli
[[File:Koronakideargumentaatio.png|600px|thumb|Argumentaatio koskien koronarokotusten pakollisuutta.]]Koronakide-hankkeeseen liittyen tehdään näkemysverkkoja koronapolitiikan eri aiheiden argumentaatiosta.


O(A|B) = F(B) O(A).
Laskennan logiikka on seuraava. Alkuperäiseen väitteeseen A kohdistuu argumentti B ja tähän kohdistuu argumentti C eli C → B → A. Prioritodennäköisyys, että A on totta on P(A), kun meillä ei ole muuta tietoa. Kun lisätään argumentti B, saadaan Bayesin kaavalla


Merkintänä F(B) tarkoittaa yleensä, että on havaittu B. Kuitenkin ennen havaintoa meillä on kaksi vaihtoehtoa, B+ todennäköisyydellä P(B+) ja B- todennäköisyydellä P(B-) = 1-P(B+). Ensimmäisessä tapauksessa Bayes-tekijä on F(B+), mutta jälkimmäisessä tapauksessa F(B-) riippuu ehdollisen todennäköisyystaulun sisällöstä. Tämän kuvauksessa käytetään kahta parametria: todennäköisyys että B on totta eli P(B+) (B:n totuusarvo) ja F(B+) eli P(B+|A+)/P(B+|A-) (relevanssi). Näistä lasketaan odotusarvo. Täydellisempi kuvaus sisältäisi kaikki mahdolliset kombinaatiot todennäköisyyksineen eli koko Bayes-verkon (BBN) yhteisjakauman. Se on kuitenkin myöhempien laskentojen asia.
P(A|B) = P(B|A)P(A)/P(B).


Spesifisyys (sp) on testin (B) tarkkuus eli kuinka vähän tulee vääriä positiivisia: sp = 1-P(B+|A-) = 1 - b/(b+d)
Sensitiivisyys (se) on testin (B) herkkyys eli todennäköisyys saada positiivinen tulos jos asia (A) on totta: se = P(B|A) = a/(a+c). Mitä parempi herkkyys, sitä vähemmän vääriä negatiivisia.


Sensitiivisyys (se) on testin herkkyys eli kuinka vähän tulee vääriä negatiivisia: se = P(B+|A+) = a/(a+c)
Spesifisyys (sp) on testin (B) tarkkuus eli todennäköisyys saada negatiivinen tulos jos asia (A) ei ole totta: sp = 1-P(B|¬A-) = 1 - b/(b+d). Mitä parempi tarkkuus, sitä vähemmän vääriä positiivisia. Herkkyys ja tarkkuus ovat tärkeitä mittareita, koska ne eivät riipu itse asian A todennäköisyydestä.
 
Bayes-tekijä F(B+) = se / (1 - sp) eli  sensitiivisyys se = 1 - sp/F(B+). Eli mitä suuremmat sensitiivisyys ja spesifisyys, sitä suurempi F. Jos sensitiivisyys oletetaan vakioksi kaikissa argumenteissa, voidaan laskea kaikki tarpeelliset tiedot mukaan lukien F(B-), kun tiedetään argumentin P(B+) ja F(B+).
 
F(B-) = (1 - se) / sp


Esimerkkinä laskennasta on oheinen taulukko.
Esimerkkinä laskennasta on oheinen taulukko.
Rivi 43: Rivi 41:
|}
|}


  F(B+) = P(B+|A+)/P(B+|A-) = 0.29/(0.29+0.01) / (0.6/(0.6+0.10)) = 0.29 * 0.70 / (0.30 * 0.60) = 203/180 ≈ 1.12778
  se = a/(a+c) = 0.29/0.30 = 29/30
   
   
  F(B-) = P(B-|A+)/P(B-|A-) = 0.01/(0.29+0.01) / (0.10/(0.6+0.10)) = 0.01 * 0.70 / (0.30 * 0.10) = 7/30 ≈ 0.2333
  sp = 1 - b/(b+d) = 1 - 0.6/0.70 = 1/7
   
   
se = 0.29/0.30 = 29/30
Bayesin kaavalla saadaan arvio P(A|B) päivitettyä, jos tiedetään priorit P(A) ja P(B) sekä ehdollinen todennäköisyys P(B|A) = se. Totuusarvot päivittyvät suoraan Bayes-verkon mukaisesti. Sen sijaan relevanssi vaatii erityiskäsittelyä.
sp = 0.10/0.70 = 1/7
F(B-) = (1-se) / (1-sp/F(B+)) = (1-29/30) / (1-29/30/(203/180)) = (1/30) / (1-174/203) = 203/(29*30) = 7/30 ≈ 0.2333
 
Argumentin vaikutus keskusteluun lasketaan seuraavasti:
* Argumenttien sensitiivisyys (vakio) se = 0.7
* Argumenttien totuuden prioritodennäköisyys P(A) = 0.5
* Argumentin relevanssin eli Bayes-tekijän "priori" F(B+) = 1.1
* Argumentin alavirtaan kohdistama relevanssikerroin R(C) = 3/2 (puolustus), 2/3 (hyökkäys)
* Argumentin totuuden posterioritodennäköisyys ylävirran totuusarvoon liittyvän argumentin B jälkeen: P(A|B) = P(A|B+)P(B+) + P(A|B-)P(B-), jossa
** P(A|B+) = O(A|B+)/(O(A|B+)+1), jossa O(A|B+) = O(A) F(B+)
** P(A|B-) = O(A|B-)/(O(A|B-)+1), jossa O(A|B-) = O(A) F(B-)
*** F(B-) = (1-se)/(1-se/F(B+))
* Argumentin relevanssin eli Bayes-tekijän "posteriori" F(B|C<sub>r</sub>) = F(B) &Pi; R(C<sub>r</sub>), jossa C<sub>r</sub> ovat ne ylävirran argumentit, jotka ovat relevanssityyppiä. Huom: vaikka tämä on matemaattisesti konsistentti rakenne, R(C):n määritelmä on epäselvä ja siksi sen arvon määräytyminen on pelkkää heuristiikkaa. Se kuitenkin mahdollistaa kokonaisen keskustelun automaattisen päivittämisen.
 
Siksipä voisi yrittää kuvausta, joka ei perustu F(B+)-tekijään vaan sensitiivisyyteen ja spesifisyyteen.


Jos tiedetään se, sp ja P(A+), voidaan laskea kaikki muut tekijät:
Argumentti B on irrelevantti joss P(B|A+) = P(B|A-) = P(B|A) eli a/(a+c) = b/(b+d) eli se + sp = 1. Niinpä relevanssi r voidaan määritellä sensitiivisyyden poikkeamaksi irrelevantista tilanteesta, eli r = (1 - sp) - se. Relevanssihyökkäykset k<sub>i</sub> puolestaan voidaan ajatella tekijöiksi, joiden takia r lähestyy nollaa eli hyökkäysten jälkeinen relevanssi r' on
P(A+) = p = a+c
se = a/(a+c) = a/p
sp = d/(b+d) = d/(1-a-c) = d/(1-p)
d = sp (1-p)
b = 1-a-c-d = 1-d-p
a = se p
c = p-a


Jos argumenttia A vastaan hyökätään totuusargumentilla B, se pienentää P(A+|B+) mutta P(A+|B-) ei muutu. Eli tarvitaan totuustekijä t*, joka muuttaa tietoja seuraavasti (pilkku tarkoittaa päivitetty arvoa):
  r' = r &Pi;(1 - k<sub>i</sub>)
  a' = a+t*
    = (1 - sp - se) &Pi;(1 - k<sub>i</sub>),
b' = b-t*
se' = (a+t*)/(a+t*+c)
sp' = d/(b-t*+d)
P(A+)' = a+t+c


Tällöin t*>0 jos argumentti on puolustus ja muutoin se on hyökkäys. Kaavoista saa myös matemaattiset rajat: t*<1-a, t*<b, t*>b-1, t*>-a eli  min(a,1-b) < t* < min(1-a,b). On syytä huomata, että t* vaikuttaa jonkin verran myös F(B+)-arvoon, eli se ei ole puhtaasti totuusparametri. Vaikutus on kuitenkin sen verran pieni, että sitä nimitetään sellaiseksi.
jossa k<sub>i</sub> ∈ [0, 1] saa sitä suurempia arvoja, mitä voimakkaampi hyökkäys relevanssia vastaan tehdään. Tämän kuvauksen hyvä puoli on, että irrelevanssipiste ei riipu A:n ja B:n todennäköisyyksistä ja että lopputulos ei riipu siitä, missä järjestyksessä relevanssihyökkäykset k<sub>i</sub> esitetään.


Jos argumenttia B vastaan hyökätään relevanssiargumentilla C, se ei vaikuta P(B+):hen mutta pienentää B:n vaikutusta A:han eli tuo F(B+) kohti ykköstä. Tarvitaan relevanssitekijä r* (negatiivinen arvo on hyökkäys, positiivinen on puolustus), joka muuttaa tietoja seuraavasti:
Jos taas halutaan esittää puolustava relevanssiargumentti, ei ole selvää, millä tavalla sensitiivisyyden tulisi muuttua. Niinpä tällä hetkellä ajatellaan, että puolustavan relevanssiargumentin yhteydessä pitää erikseen ilmoittaa, mikä kohdeargumentin sensitiivisyys on puolustuksen jälkeen. Tätä on vaikea automatisoida, joten tätä pitää opetella todellisten käyttäjätapausten kautta: millaisia keskusteluja tarvitaan, jotta käyttäjät voivat päätyä perusteltuihin päätelmiin relevanssin suuruudesta?
a' = a+r*
b' = b-r*
c' = c-r*
d' = d+r*
P(B+)' = P(B+)
se' = (a+r*)/(a+c)
sp' = (d+r*)/(b+d)
F(B+)' = se'/(1-sp') = (a+r*)/(a+c)/(1-(d+r*)/(b+d))


Tällöin r*>0 jos argumentti lisää argumentin B puolustusvoimaa ja r*<=0 jos se vähentää sitä. Tämä on hankalaa, koska vaikutus siis riippuu siitä, onko F(B+)>1 vai ei. Siksi tämä on syytä huomioida parametrisoinnissa. Matemaattiset rajat ovat r*<min(1-a, b, c, 1-d) ja r*>max(-a, b-1, c-1, -d).
=== Laskenta ===


Parametrisoidaan tämä niin, että t* ja r* lasketaan parametreista t ja r, jotka voivat saada arvoja ]-1 .. 1[, jolloin
==== Piirrä näkemysverkko koronakeskustelusta ====
t* = t min(a, 1-b), jos t<0
t* = t min(1-a, b), jos t>=0
r* = -abs(r) min(a, 1-b, 1-c, d), jos F(B+)<1 ja r>=0 tai F(B+)>=1 ja r<0
r* = abs(r) min(1-a, b, c, 1-d), jos F(B+)>=1 ja r>=0 tai F(B+)<1 ja r<0.
 
Jos unohdetaan t* ja r* ja keskitytään nelikentän muodostamiseen. Mitä tietoja tarvitaan, jotta se saadaan yksikäsitteisesti muodostettua?
* Jos tiedetään poikkisummat A+ ja B+, saadaan laskettua myös A- = 1-A+ ja B- = 1-B+. Tällöin A+ = a+c, B+ = a+b, 1-A+ = b+d ja 1-B+ = c+d, mutta lisäksi on tiedettävä vielä kolmas asia eli a, b, c tai d, jotta saadaan yksikäsitteinen nelikenttä.
* Voisivatko ne kolme asiaa olla A+, B+ ja F(B+)? Tai entä se?
A+ = a+c
B+ = a+b
F(B+) = a/(a+c)/(b/(b+d)) = (A+-c)/(A+)/(B+-(A+-c))/(1-A+)) = (A+-c-A+^2+cA+)/(A+B+-A+^2-cA+) {{argument|relat1=attack|id=arg3163|type=|content=Vaikeaa.|sign=--[[Käyttäjä:Jouni|Jouni Tuomisto]] ([[Keskustelu käyttäjästä:Jouni|keskustelu]]) 26. heinäkuuta 2021 kello 21.04 (UTC)}}
se = a/(a+c) <=> a = se(A+), joten b = B+ -se(A+), c = A+-se(A+), d=1-A+-B+ +se(A+) {{argument|relat1=defense|id=arg5025|type=|content=Tämä toimii.|sign=--[[Käyttäjä:Jouni|Jouni Tuomisto]] ([[Keskustelu käyttäjästä:Jouni|keskustelu]]) 26. heinäkuuta 2021 kello 21.04 (UTC)}}
 
Koska P(A+|B+) saadaan laskettua a/(a+b), matemaattinen määrittelyjoukko on 0 < P(A+), P(B+), se, a, b < 1 eli erityisesti 0 < P(B+)-se P(A+) < 1 eli (P(B+)-1)/P(A+) < se < P(B+)/P(A+). Koska P(B+)<=1, alarajaehto ei tule koskaan vastaan vaan riittää, että se>0. Sen sijaan ylärajaehto voi hyvinkin olla <1 eli tulee joskus rajoittavaksi tekijäksi.
 
Argumentti on epärelevantti, jos P(A+) = P(A+|B+) = a/(a+b) = seP(A+)/P(B+) eli se = P(B+).
 
Jotta käyttäjän antamat parametrit olisivat aina määriteltyjä ja helppo ymmärtää,  voitaisiin ottaa käyttöön seprime-parametri, joka saa arvoja välillä ]-1,1[, joka kattaa koko sensitiivisyyden määrittelyjoukon ja joka saa epärelevantin argumentin kohdalla arvon 0. Niinpä
 
se = P(B+) + seprime(min(1,P(B+)/P(A+)) - P(B+)), jos 0 <= seprime < 1
se = P(B+) + seprimeP(B+), jos -1 < seprime < 0.


<rcode>
<rcode>
Rivi 123: Rivi 64:


library(OpasnetUtils)
library(OpasnetUtils)
library(gsheet)
library(tidyverse)


objects.latest("Op_en3861", code_name="makeGraph") # [[Insight network]] makeGraph
# First version of data https://docs.google.com/spreadsheets/d/1Wzj_VqubkV6uomQS-St5UxzS5k25dDBs15DQFEsroOg/edit#gid=0


if (!exists("formatted")) {
objects.latest("Op_en3861", code_name="makeGraph2") # [[Insight network]] makeGraph
  objects.latest("Op_en3861", code_name = "formatted")
objects.latest("Op_en2382", code_name="update") # [[Discussion]] update_truth, update_relevance, infer_tree
}
if (!exists("chooseGr")) {
  objects.latest("Op_en3861", code_name = "chooseGr")
}
 
get_probability_a_given_b <- function(
  paplus, # P(A+) prior probability for A being true
  pbplus, # P(B+) probability of argument B being true
  sp, # specificity of argument B about A
  se # sensitivity of argument B about A # fbplus # F(B+) Bayes factor for argument B when true
) {
  oaplus <- paplus/(1-paplus) # O(A) prior odds for argument A being true
  fbplus <- (sp/(1-se))
  fbminus <- (1-sp)/(1-sp/fbplus)
#  fbminus[fbminus<0] <- 50 # Error check; if it goes to negativity, it is actually large.
  oabminus <- oaplus * fbminus # O(A|B-) odds of A given that B is false
  oabplus <- oaplus * fbplus
  pabminus <- oabminus/(oabminus+1) # P(A|B-) probability of A given that B is false
  pabplus <- oabplus/(oabplus+1)
  pab <- c(pabplus*pbplus, pabminus*(1-pbplus)) # P(A|B) probability of A given B
  print(signif(c(paplus, pbplus,sp, fbplus, fbminus,pabplus,pab,sum(pab)),3))
  return(c(sum(pab)))
}
 
# Prior odds and probability values
TRUTHLIKENESS_PRIOR_PA <- 0.7
RELEVANCE_PRIOR_FBPLUS <- 3
SPECIFICITY_PRIOR_SP <- 0.9
SENSITIVITY_PRIOR_SE <- 0.8
RELEVANCE_FACTOR_DEFENSE_RC <- 5
RELEVANCE_FACTOR_R <- 0.7
TRUTH_FACTOR_T <- 0.7
TRUTH_LIMIT <- 0.05
RELEVANCE_LIMIT <- 0.2
SENSITIVITY_PRIME <- 0.3
 
se <- SENSITIVITY_PRIOR_SE
sp <- SPECIFICITY_PRIOR_SP
paplus <- TRUTHLIKENESS_PRIOR_PA
colour <- "PRO"
 
update_relevance <- function(
  param_vector, # vector of three numeric values: P(A+), se, sp
  r_ # relevance change parameter: ]-1,1[:
) {
  paplus <- param_vector[1]
  se <- param_vector[2]
  sp <- param_vector[3]
  fbplus <- se/(1-sp)
  d <- sp * (1-paplus)
  b <- 1-d-paplus
  a <- se * paplus
  c <- paplus-a
  rstar <- r_ * ifelse(
    fbplus>=1 & r_>=0 | fbplus<1 & r<0,
    min(1-a, b, c, 1-d), -1*min(a, 1-b, 1-c, d))
  seprime <- (a+rstar)/(paplus)
  spprime <- (d+rstar)/(b+d)
  paplusprime <- a/(a+b)
  return(c(paplus = paplusprime, se = seprime, sp = spprime))
}
# P(A|B) = P(B|A)P(A)/P(B) = (a/(a+c))*(a+c)/(a+b) = a/(a+b)


#update_relevance(c())
preprocess_arguments <- function(
update_truth <- function(
   file_path, # Name of zip file at Opasnet
   paplus, # P(A+)
  wiki = "opasnet_fi", # Wiki identifier
   pbplus, # P(B+)
   file_name, # Name of file in the zip file
   seprime # parameter for producing se
   relevants = NA, # vector of Items for relevance arguments
  addition = NA, # vector of arguments to be added to original list.
  truth_prior = 0.3, # prior truth value without other information
  truth_prior_with_reference = 0.7, # prior truth value with credible reference
  sensitivity_prime = 0.3, # sensitivity defend value without other information
  sensitivity_prime_attack = -0.5 # sensitivity attack value without other information
) {
) {
   if(any(paplus>=1) | any(paplus<=0)) stop("probability P(A+) must be between ]0,1[, not ",paplus)
   dfl <- opasnet.data(file_path, wiki, unzip=file_name)
   if(any(pbplus>=1) | any(pbplus<=0)) stop("probability P(B+) must be between ]0,1[, not", pbplus)
  #  dfl <- read_lines("~/discussion/climate/what-is-the-best-measure-to-decrease-climate-change-31294.txt")
   if(any(seprime <= -1) | any(seprime >=1)) stop("seprime must be between ]-1,1[, not", seprime)
  dfl <- strsplit(dfl, "\n")[[1]]
   if(seprime>=0) {
   df_title <- gsub("Discussion Title: ", "", dfl[1])
    se <- pbplus + seprime * (pmin(1,pbplus/paplus) - pbplus)
   dfl <- dfl[-(1:2)]
   } else {
  if(!any(is.na(addition))) dfl <- c(dfl, addition)
    se <- pbplus + seprime * pbplus
   df <- data.frame(level = regexpr("\\. ",dfl))
  }
   df$Item = substr(dfl,1,df$level-1)
  a <- se* paplus
   df$class = substr(dfl,df$level+6,regexpr(":", dfl)-1)
  b <- pbplus -se*paplus
   df$colour <- substr(dfl,df$level+2, df$level+4)
  c <- paplus -se*paplus
   df$colour <- ifelse(df$colour %in% c("Pro","Con"), df$colour, "Thesis")
  d <- 1-paplus-pbplus+se*paplus
   df$text = substr(dfl, ifelse(df$colour=="Thesis",regexpr("\\. ",dfl), regexpr(":",dfl))+2,999)
   sp <- d/(b+d)
  df$level <- nchar(gsub("[0-9]","", df$Item))
  pab <- a/(a+b)
  added_argument <- unlist(lapply(strsplit(df$Item,split="\\."), FUN=function(x) max(as.numeric(x))))
   fb <- se/(1-sp)
  df$level <- df$level * ifelse(added_argument < 99, 1, ifelse(added_argument>999, 10, 0.1))
   papost <- a/(a+b)*pbplus + c/(c+d)*(1-pbplus)
  df$Object <- gsub("\\.[0-9]*$","", df$Item)
   return(c(pab,se,papost))#, a, b, c, d, sum(a, b, c, d), se, sp, fb))
  df$relevance <- ifelse(df$colour=="Pro",sensitivity_prime, sensitivity_prime_attack)
#  return(c(paplus = paplusprime, pbplus = pbplusprime, se = seprime))
  df$truth <- ifelse(grepl("http", df$text), truth_prior_with_reference, truth_prior)
}
  df$class <- ifelse(df$class=="", "truth", df$class)
 
   df$class <- ifelse(df$colour=="Thesis", "fact", df$class)
ps <- c(0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 0.999)
  if(!any(is.na(relevants))) df$class[df$Item %in% relevants] <- "relevance"
out <- data.frame()
  df$alias <- ifelse(grepl("^-> See", df$text), gsub("\\.$", "", substr(df$text,8,999)), "")
for(i in ps) {
  df$alias[grepl("discussion",df$alias)] <- ""
   for(j in ps) {
 
    for(k in c(rev(-ps), 0, ps)) {
  return(list(df_title, df))
      tmp <- update_truth(i,j,k)
      out <- rbind(out, data.frame(
        pa=i,
        pb=j,
        seprime=k,
        se=tmp[2],
        pab=tmp[1],
        papost=tmp[3],
        lower=(j-1)/i,
        upper=j/i
        ))
    }
  }
}
}


update_relevance <- function(
prepare_graph <- function(
   pcplus, # P(C+)
   df = df,
#  colour, # df$colour of argument C, either PRO or CON
  drop_gray = TRUE, # Drop gray branches?
   seprimeb, # relevance parameter prior for argument B, ]-1,1[
  drop_higher_levels = 0, # Drop higher levels (0: drop nothing)?
   seprimec # relevance parameter for argument C, ]-1,1[
  RELEVANCE_LIMIT = 0.2, # value below which argument is considered irrelevant and dropped from graph
   TRUTH_LIMIT = 0.05, # value below which argument is considered untrue and dropped from graph
   verbose=FALSE
) {
) {
   seprimeb_sign <- sign(seprimeb)
   thesis <- df$colour=="Thesis"
  out <- abs(seprimeb)
   df$edge.penwidth <- abs(df$relevance*15)
  if(seprimec>=0) {
   df$node.width <- ifelse(thesis,1,df$truth)
    out <- out + seprimec*pcplus*(1-out)
   df$node.fontsize <- ifelse(thesis,15,df$truth*20)
  } else {
    out <- out - seprimec*pcplus*out
  }
  out <- out * seprimeb_sign
  return(out)
}
 
df$seprime <- SENSITIVITY_PRIME * ifelse(df$colour=="PRO",1,-1)
df$truth_prior <- TRUTHLIKENESS_PRIOR_PA
args_by_level <- df$Item[order(-df$level)]
for(arg in args_by_level) {
   parents <- df$Item[df$Object==arg]
  for(parent in parents) {
    if(df$class[df$Item==parent]=="truth") {
#      t_ <- ifelse(df$colour[df$Item==parent]=="PRO",TRUTH_FACTOR_T, -TRUTH_FACTOR_T)
      df$truth_prior[df$Item==arg] <- update_truth(
        df$truth_prior[df$Item==arg],
        df$truth_prior[df$Item==parent],
        df$seprime[df$Item==arg]
#        df$specificity[df$Item==arg]
#        t_
      )[1]
#      df$truth_prior[df$Item==arg] <- out[1]
#      df$seprime[df$Item==arg] <- out[2]
#      df$specificity[df$Item==arg] <- out[3]
    }
    if(df$class[df$Item==parent]=="relevance") {
#      r_ <- ifelse(df$colour[df$Item==parent]=="PRO",RELEVANCE_FACTOR_R, -RELEVANCE_FACTOR_R)
      df$seprime[df$Item==arg] <- update_relevance(
        df$truth_prior[df$Item==parent],
        df$seprime[df$Item==arg],
        df$seprime[df$Item==parent]
      )
#        r_)
#      df$truth_prior[df$Item==arg] <- out[1]
#      df$sensitivity[df$Item==arg] <- out[2]
#      df$specificity[df$Item==arg] <- out[3]
    }
   }
}
 
get_probability_a_given_b(0.8,0.99,0.99,1/10)
 
df <- gsheet2tbl("https://docs.google.com/spreadsheets/d/1Wzj_VqubkV6uomQS-St5UxzS5k25dDBs15DQFEsroOg/edit#gid=0")
 
df$Item <- gsub("\\.$", "", df$position)
#df <- df[1:133,] #-c(2,4,5,7,8)]
 
df$Object <- gsub("\\.[0-9]$","", df$Item)
df$truth_prior <- df$truth_post <- TRUTHLIKENESS_PRIOR_PA
df$relev_prior <- RELEVANCE_PRIOR_FBPLUS
df$specificity <- ifelse(df$colour=="PRO", SPECIFICITY_PRIOR_SP, 1-SPECIFICITY_PRIOR_SP)
df$sensitivity <- ifelse(df$colour=="PRO", SENSITIVITY_PRIOR_SE, 1-SENSITIVITY_PRIOR_SE)
#df$relevance_factor <- ifelse(
#  df$class!="relevance", NA,
#  ifelse(df$colour=="PRO", RELEVANCE_FACTOR_DEFENSE_RC, 0.1/RELEVANCE_FACTOR_DEFENSE_RC))
df$level <- nchar(gsub("[0-9]","", df$Item))
df$fbplus <- RELEVANCE_PRIOR_FBPLUS
#df <- df[df$level<4,]
 
args_by_level <- df$Item[order(-df$level)]
for(arg in args_by_level) {
  # Relevance factors of parents R(C_r)
   rcr <- prod(df$relevance_factor[df$Object==arg & df$class=="relevance"])
  rcr <- 1 + df$relev_prior[df$Item==arg] * rcr
  if(df$colour[df$Item==arg]=="CON") rcr <- 0.1/rcr
  df$fbplus[df$Item==arg] <- rcr
  parents <- df$Item[df$Object==arg & df$class=="truth"]
  for(parent in parents) {
    print(c(arg, parent))
    df$truth_post[df$Item==arg] <- get_probability_a_given_b(
      paplus = df$truth_prior[df$Item==arg],
      pbplus = df$truth_post[df$Item==parent],
      sp = df$specificity[df$Item==parent],
      fbplus = df$fbplus[df$Item==parent]
    )
  }
}
 
prepare_graph <- function(df=df) {
  df$edge.penwidth <- abs(df$seprime*15)
  df$node.width <- df$truth_prior
  df$node.fontsize <- df$truth_prior*15
   df$node.color <- ifelse(df$class=="truth","orange","blue")
   df$node.color <- ifelse(df$class=="truth","orange","blue")
   df$Context <- "Koronakide"
   df$Context <- "Koronakide"
   df$label <- substr(df$text, 1,30)
   df$label <- substr(df$text, 1,30)
  df$label <- paste(df$label, ifelse(thesis, signif(df$truth,2),""))
   df$rel <- ifelse(toupper(df$colour)=="PRO","relevant defense","relevant attack")
   df$rel <- ifelse(toupper(df$colour)=="PRO","relevant defense","relevant attack")
   df$rel <- paste0(ifelse(abs(df$seprime) < RELEVANCE_LIMIT, "ir", ""), df$rel)
   df$rel <- paste0(ifelse(abs(df$relevance) < RELEVANCE_LIMIT, "ir", ""), df$rel)
   df$type <- "argument"
   df$type <- "argument"
   df$type <- ifelse(df$class %in% c("value","fact"), paste(df$class,"opening statement"), df$type)
   df$type <- ifelse(df$class %in% c("value","fact"), paste(df$class,"opening statement"), df$type)
   df$Description <- df$text
   df$Description <- df$text
   drop <- df$Item[(df$truth_prior<TRUTH_LIMIT | abs(df$seprime)<RELEVANCE_LIMIT) & df$level>0]
   drop <- df$Item[(df$truth<TRUTH_LIMIT | abs(df$relevance)<RELEVANCE_LIMIT) & df$level>0]
   print(drop)
   if(verbose) print(drop)
   out <- character()
   out <- character()
   tmp <- drop
   tmp <- drop
Rivi 346: Rivi 137:
     branch <- tmp[grep(paste0("^",i), tmp)]
     branch <- tmp[grep(paste0("^",i), tmp)]
     if(length(branch)>0) {
     if(length(branch)>0) {
       print(branch)
       if(verbose) print(branch)
       out <- c(out, branch[1])
       out <- c(out, branch[1])
       tmp <- tmp[!tmp %in% branch[-1]]
       tmp <- tmp[!tmp %in% branch[-1]]
Rivi 352: Rivi 143:
   }
   }
   drop <- out
   drop <- out
   print(drop)
   if(verbose) print(drop)
   df$node.fillcolor <- "white"
   df$node.fillcolor <- "white"
   for(i in drop) {
   for(i in drop) {
     df$node.fillcolor = ifelse(grepl(paste0("^",i), df$Item), "gray", df$node.fillcolor)
     df$node.fillcolor = ifelse(grepl(paste0("^",i), df$Item), "gray", df$node.fillcolor)
   }
   }
   df <- df[df$node.fillcolor!="gray" | df$Item %in% drop ,]
   if(drop_gray) df <- df[df$node.fillcolor!="gray" | df$Item %in% drop ,]
  if(drop_higher_levels>0) df <- df[df$level<=drop_higher_levels | df$level>10,]
   return(df)
   return(df)
}
}


gr <- makeGraph(ova=prepare_graph(df=df), formatted=formatted)
if (!exists("formatted")) {
render_graph(gr, title="Kialo-keskustelu koronarokotteiden pakollisuudesta")
  objects.latest("Op_en3861", code_name = "formatted")
export_graph(gr, "~/home/jouni/Documents/Koronakide.svg")
}
if (!exists("chooseGr")) {
  objects.latest("Op_en3861", code_name = "chooseGr")
}
 
file_list_covid <- c(
  "are-tracking-apps-a-legitimate-and-proportional-means-to-fight-covid-19-36145.txt"                ,
  "do-people-have-a-right-to-not-wear-a-mask-in-public-spaces-during-the-covid-19-pandemic-38770.txt",
  "do-we-need-a-vaccine-to-fight-the-covid-19-pandemic-38268.txt"                                    ,
  "do-we-need-a-vaccine-to-fight-the-covid-19-pandemic-38268(1).txt"                                ,
  "education-will-never-be-the-same-as-it-was-before-covid-19-43590.txt"                            ,
  "is-covid-19-more-dangerous-than-regular-flu-viruses-34602.txt"                                    ,
  "is-herd-immunity-for-covid-19-achievable-39248.txt"                                              ,
  "is-it-wrong-to-have-a-lockdown-for-covid-19-36981.txt"                                            ,
  "should-a-global-curfew-be-introduced-to-stop-covid-19-34523.txt"                                  ,
  "should-countries-have-closed-their-borders-to-china-to-reduce-the-spread-of-covid-19-33660.txt"  ,
  "should-covid-19-vaccines-be-mandatory-39517.txt"                                                  ,
  "should-schools-close-during-the-covid-19-pandemic-44845.txt"                                      ,
  "should-vaccine-passports-be-mandatory-49452.txt"                                                  ,
  "will-covid19-bring-lasting-environmental-changes-34939.txt"                                      ,
  "will-the-covid-19-pandemic-have-a-lasting-impact-on-society-34267.txt"       
)
 
file_list_climate <- c(
  "a-carbon-tax-should-be-implemented-to-subsidize-the-reduction-of-consumers-carbon-footprint-25338.txt"                        ,
  "all-humans-should-be-vegan-2762.txt"                                                                                          ,
  "are-battery-electric-vehicles-better-than-hydrogen-fuel-cell-vehicles-2710.txt"                                              ,
  "are-the-milankovitch-cycles-major-causes-of-climate-change-14194.txt"                                                        ,
  "are-the-rich-or-the-poor-more-responsible-for-environmental-damages-10248.txt"                                                ,
  "climate_discussions.zip"                                                                                                      ,
  "deep-sea-oil-and-gas-exploration-in-the-great-australian-bight-should-be-banned-15489.txt"                                    ,
  "do-we-need-nuclear-power-for-sustainable-energy-production-6182.txt"                                                          ,
  "do-wind-farms-have-more-advantages-than-disadvantages-9620.txt"                                                              ,
  "is-carpooling-the-way-of-the-future-18711.txt"                                                                                ,
  "is-climate-crisis-inevitable-31239.txt"                                                                                      ,
  "is-having-children-a-bad-idea-in-todays-times-13236.txt"                                                                      ,
  "is-it-appropriate-for-the-epa-to-declare-biomass-to-be-carbon-neutral-14080.txt"                                              ,
  "is-it-reasonable-to-create-a-directly-democratic-and-all-inclusive-internet-based-forum-to-address-global-issues-43718.txt"  ,
  "is-low-energy-nuclear-reaction-lenr-technology-the-solution-to-fossil-fuel-burning-30393.txt"                                ,
  "is-organic-farming-better-than-conventional-farming-9613.txt"                                                                ,
  "is-the-united-nations-the-best-forum-to-tackle-climate-change-27811.txt"                                                      ,
  "no-one-should-feel-obliged-to-change-their-lifestyle-to-combat-global-warming-30084.txt"                                      ,
  "periodic-lockdowns-should-be-planned-as-emergency-measures-to-fight-climate-change-36808.txt"                                ,
  "recycling-works-30534.txt"                                                                                                    ,
  "should-fracking-be-banned-7587.txt"                                                                                          ,
  "should-governments-push-to-implement-100%-renewable-energy-3871.txt"                                                          ,
  "should-governments-subsidize-ethanol-10385.txt"                                                                              ,
  "should-humans-act-to-fight-climate-change-4540.txt"                                                                          ,
  "should-nuclear-energy-replace-fossil-fuels-9326.txt"                                                                          ,
  "should-people-go-vegan-if-they-can-31640.txt"                                                                                ,
  "should-private-cars-be-forbidden-in-large-cities-9351.txt"                                                                    ,
  "should-public-transport-be-free-33112.txt"                                                                                    ,
  "should-renewable-energy-sources-replace-fossil-fuels-15900.txt"                                                              ,
  "should-the-ecological-crisis-we-are-facing-become-our-collective-and-singular-focus-3185.txt"                                ,
  "should-the-eu-introduce-a-carbon-tax-29370.txt"                                                                              ,
  "should-the-us-government-commit-to-a-green-new-deal-30325.txt"                                                                ,
  "should-the-us-have-pulled-out-of-the-paris-climate-agreement-15487.txt"                                                      ,
  "should-there-be-one-singular-global-governmententity-31213.txt"                                                              ,
  "the-earth-will-not-be-irreparable-in-12-years-from-climate-change-32101.txt"                                                  ,
  "the-fight-of-western-countries-against-climate-change-is-hypocritical-31852.txt"                                              ,
  "the-us-should-adopt-a-carbon-fee-and-dividend-plan-to-address-the-primary-cause-of-climate-change-30792.txt"  ,
  "the-world-needs-an-international-environmental-government-that-has-political-power-to-mitigate-environmental-damage-45042.txt",
  "there-should-be-further-research-on-solar-geoengineering-16729.txt"                                                          ,
  "universities-should-divest-from-fossil-fuels-28142.txt"                                                                      ,
  "vertical-farming-is-the-future-of-agriculture-7487.txt"                                                                      ,
  "we-should-adapt-to-climate-change-rather-than-advert-it-31679.txt"                                                            ,
  "what-is-the-best-measure-to-decrease-climate-change-31294.txt"                                                                ,
  "what-is-the-worst-world-problem-of-the-utmost-concern-9143.txt"                                                              ,
  "will-man-made-climate-change-cause-human-extinction-31221.txt"
)
 
relevants <- opasnet.data("4/44/Covid-19_discussions.zip", wiki="op_fi", unzip="should-covid-19-vaccines-be-mandatory-39517_relevants.txt")
relevants <- strsplit(relevants, split="\n")[[1]]
addition <- opasnet.data("4/44/Covid-19_discussions.zip", wiki="op_fi", unzip="should-covid-19-vaccines-be-mandatory-39517_addition.txt")
addition <- strsplit(addition, split="\n")[[1]]
 
df <- preprocess_arguments(
#  file_path =  "7/74/Climate_discussions.zip",
#  file_name = file_list_climate[43],
#  relevants = NA,#relevants, # NA for all others except discussion #11 Should COVID-19 vaccines be mandatory?
#  addition = NA,#addition,
    file_path =  "4/44/Covid-19_discussions.zip",
    file_name = "should-covid-19-vaccines-be-mandatory-39517.txt",
    relevants = relevants,
    addition = addition,
  truth_prior = 0.3,
  truth_prior_with_reference = 0.7,
  sensitivity_prime = 0.3,
  sensitivity_prime_attack = -0.5
)
 
gr <- makeGraph(
  ova=prepare_graph(
    df=infer_tree(df[[2]], verbose=FALSE),
    drop_gray = TRUE,
    drop_higher_levels = 2,
    TRUTH_LIMIT = 0.1,
    RELEVANCE_LIMIT = 0.2,
    verbose=FALSE),
  formatted=formatted)
render_graph(gr, title=df[[1]])
 
#export_graph(gr, "~/home/jouni/Documents/Koronakide.svg")
 
#out <- prepare_graph(
#  df=infer_tree(df[[2]]),
#  drop_gray = TRUE, drop_higher_levels = 3, TRUTH_LIMIT = 0.1, RELEVANCE_LIMIT = 0.2, verbose=FALSE)
 
#df_default <- infer_tree(df)
#df_no_relevance <- infer_tree(df %>% mutate(class="truth"), sensitivity_prime, truth_prior)
#plot(df_default$truth, df_no_relevance$truth)
# The correlation between inference with truth/relevance classification and that without is not great.
# However, it is reasonable for very high and very low values.
# So, let's try to analyze a large amount of discussions with truth-only setting
</rcode>
</rcode>


=== Hae kirjanmerkit Firefoxista ===
==== Hae kirjanmerkit Firefoxista ====


<rcode>
<rcode>
Rivi 387: Rivi 292:
== Katso myös ==
== Katso myös ==


* Aiempi versio, jossa käytettiin relevanssitekijää ja oletettiin ettei spesifisyyttä tiedetä. [http://fi.opasnet.org/fi-opwiki/index.php?title=Koronavirus&oldid=36880#N.C3.A4kemysverkko_Kialon_koronakeskustelusta]
* A Global collection of open source projcts during COVID-19 [http://open-source-covid-19.weileizeng.com/]
* A Global collection of open source projcts during COVID-19 [http://open-source-covid-19.weileizeng.com/]
* Annu Haho, Marja Tiirola. Sammutammeko koronakriisiä oikeilla välineillä? Suojaa-testaa-jäljitä-eristä-hoida! Miten? [https://www.suolistoblogi.com/446264861]
* Annu Haho, Marja Tiirola. Sammutammeko koronakriisiä oikeilla välineillä? Suojaa-testaa-jäljitä-eristä-hoida! Miten? [https://www.suolistoblogi.com/446264861]
Rivi 674: Rivi 580:
* [https://www.hs.fi/mielipide/art-2000006525265.html Avoin tieteellinen keskustelu parantaisi hallinnon toimintaa - Mielipide | HS.fi]
* [https://www.hs.fi/mielipide/art-2000006525265.html Avoin tieteellinen keskustelu parantaisi hallinnon toimintaa - Mielipide | HS.fi]
* [https://masks4all.co/letter-over-100-prominent-health-experts-call-for-cloth-mask-requirements/ Over 100 prominent academics call for mask requirements - #Masks4All]
* [https://masks4all.co/letter-over-100-prominent-health-experts-call-for-cloth-mask-requirements/ Over 100 prominent academics call for mask requirements - #Masks4All]
=== Arkisto ===
* [http://fi.opasnet.org/fi-opwiki/index.php?title=Koronavirus&oldid=36857#Piirr.C3.A4_n.C3.A4kemysverkko_Kialon_koronakeskustelusta Arkistoitu aiempi pohdinta] perustuen mm. vedonlyöntisuhteisiin sekä totuus- ja relevanssifaktoreihin. Lisäksi käytettiin termistä P(B|A) nimeä sensitiivisyys, mikä on sinänsä oikein mutta ei ehkä hyödyllistä.

Nykyinen versio 1. elokuuta 2022 kello 09.33




Koronavirus käsittelee SARS-COV-2-viruksen ja sen aiheuttaman COVID-19-taudin olennaisia piirteitä.

Perustelut

Linkkejä

Data

Keskusteluja koronaviruksesta ja kovidista Kialo-alustalla, esim. Onko kovidipandemialla pysyviä vaikutuksia yhteiskuntaan?. Alla olevassa tiedostossa on 15 keskustelua aihepiiristä. Toisessa tiedostossa on Kialon ilmastokeskusteluja.

Näkemysverkko Kialon koronakeskustelusta

Argumentaatio koskien koronarokotusten pakollisuutta.

Koronakide-hankkeeseen liittyen tehdään näkemysverkkoja koronapolitiikan eri aiheiden argumentaatiosta.

Laskennan logiikka on seuraava. Alkuperäiseen väitteeseen A kohdistuu argumentti B ja tähän kohdistuu argumentti C eli C → B → A. Prioritodennäköisyys, että A on totta on P(A), kun meillä ei ole muuta tietoa. Kun lisätään argumentti B, saadaan Bayesin kaavalla

P(A|B) = P(B|A)P(A)/P(B).

Sensitiivisyys (se) on testin (B) herkkyys eli todennäköisyys saada positiivinen tulos jos asia (A) on totta: se = P(B|A) = a/(a+c). Mitä parempi herkkyys, sitä vähemmän vääriä negatiivisia.

Spesifisyys (sp) on testin (B) tarkkuus eli todennäköisyys saada negatiivinen tulos jos asia (A) ei ole totta: sp = 1-P(B|¬A-) = 1 - b/(b+d). Mitä parempi tarkkuus, sitä vähemmän vääriä positiivisia. Herkkyys ja tarkkuus ovat tärkeitä mittareita, koska ne eivät riipu itse asian A todennäköisyydestä.

Esimerkkinä laskennasta on oheinen taulukko.

A+ A- Sum
B+ 0.29 (a) 0.60 (b) 0.89
B- 0.01 (c) 0.10 (d) 0.11
Sum 0.30 0.70 1.00
se = a/(a+c) = 0.29/0.30 = 29/30

sp = 1 - b/(b+d) = 1 - 0.6/0.70 = 1/7

Bayesin kaavalla saadaan arvio P(A|B) päivitettyä, jos tiedetään priorit P(A) ja P(B) sekä ehdollinen todennäköisyys P(B|A) = se. Totuusarvot päivittyvät suoraan Bayes-verkon mukaisesti. Sen sijaan relevanssi vaatii erityiskäsittelyä.

Argumentti B on irrelevantti joss P(B|A+) = P(B|A-) = P(B|A) eli a/(a+c) = b/(b+d) eli se + sp = 1. Niinpä relevanssi r voidaan määritellä sensitiivisyyden poikkeamaksi irrelevantista tilanteesta, eli r = (1 - sp) - se. Relevanssihyökkäykset ki puolestaan voidaan ajatella tekijöiksi, joiden takia r lähestyy nollaa eli hyökkäysten jälkeinen relevanssi r' on

r' = r Π(1 - ki)
   = (1 - sp - se) Π(1 - ki),

jossa ki ∈ [0, 1] saa sitä suurempia arvoja, mitä voimakkaampi hyökkäys relevanssia vastaan tehdään. Tämän kuvauksen hyvä puoli on, että irrelevanssipiste ei riipu A:n ja B:n todennäköisyyksistä ja että lopputulos ei riipu siitä, missä järjestyksessä relevanssihyökkäykset ki esitetään.

Jos taas halutaan esittää puolustava relevanssiargumentti, ei ole selvää, millä tavalla sensitiivisyyden tulisi muuttua. Niinpä tällä hetkellä ajatellaan, että puolustavan relevanssiargumentin yhteydessä pitää erikseen ilmoittaa, mikä kohdeargumentin sensitiivisyys on puolustuksen jälkeen. Tätä on vaikea automatisoida, joten tätä pitää opetella todellisten käyttäjätapausten kautta: millaisia keskusteluja tarvitaan, jotta käyttäjät voivat päätyä perusteltuihin päätelmiin relevanssin suuruudesta?

Laskenta

Piirrä näkemysverkko koronakeskustelusta

+ Näytä koodi

Hae kirjanmerkit Firefoxista

+ Näytä koodi

Katso myös

Arkisto

  • Arkistoitu aiempi pohdinta perustuen mm. vedonlyöntisuhteisiin sekä totuus- ja relevanssifaktoreihin. Lisäksi käytettiin termistä P(B|A) nimeä sensitiivisyys, mikä on sinänsä oikein mutta ei ehkä hyödyllistä.