Ero sivun ”Koronavirus” versioiden välillä

Opasnet Suomista
Siirry navigaatioon Siirry hakuun
Rivi 162: Rivi 162:
TRUTH_FACTOR_T <- 0.7
TRUTH_FACTOR_T <- 0.7
TRUTH_LIMIT <- 0.05
TRUTH_LIMIT <- 0.05
RELEVANCE_LIMIT <- 0.05
RELEVANCE_LIMIT <- 0.2
SENSITIVITY_PRIME <- 0.3


se <- SENSITIVITY_PRIOR_SE
se <- SENSITIVITY_PRIOR_SE
Rivi 192: Rivi 193:


#update_relevance(c())
#update_relevance(c())
update_node <- function(
update_truth <- function(
   paplus, # P(A+)
   paplus, # P(A+)
   pbplus, # P(B+)
   pbplus, # P(B+)
Rivi 222: Rivi 223:
   for(j in ps) {
   for(j in ps) {
     for(k in c(rev(-ps), 0, ps)) {
     for(k in c(rev(-ps), 0, ps)) {
       tmp <- update_node(i,j,k)
       tmp <- update_truth(i,j,k)
       out <- rbind(out, data.frame(
       out <- rbind(out, data.frame(
         pa=i,
         pa=i,
Rivi 236: Rivi 237:
   }
   }
}
}
update_relevance <- function(
  pcplus, # P(C+)
#  colour, # df$colour of argument C, either PRO or CON
  seprimeb, # relevance parameter prior for argument B, ]-1,1[
  seprimec # relevance parameter for argument C, ]-1,1[
) {
  seprimeb_sign <- sign(seprimeb)
  out <- abs(seprimeb)
  if(seprimec>=0) {
    out <- out + seprimec*pcplus*(1-out)
  } 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)]
args_by_level <- df$Item[order(-df$level)]
for(arg in args_by_level) {
for(arg in args_by_level) {
Rivi 241: Rivi 262:
   for(parent in parents) {
   for(parent in parents) {
     if(df$class[df$Item==parent]=="truth") {
     if(df$class[df$Item==parent]=="truth") {
      t_ <- ifelse(df$colour[df$Item==parent]=="PRO",TRUTH_FACTOR_T, -TRUTH_FACTOR_T)
#      t_ <- ifelse(df$colour[df$Item==parent]=="PRO",TRUTH_FACTOR_T, -TRUTH_FACTOR_T)
       out <- update_truth(param_vector = c(
       df$truth_prior[df$Item==arg] <- update_truth(
         df$truth_prior[df$Item==arg],
         df$truth_prior[df$Item==arg],
         df$sensitivity[df$Item==arg],
         df$truth_prior[df$Item==parent],
         df$specificity[df$Item==arg]),
         df$seprime[df$Item==arg]
        t_
#        df$specificity[df$Item==arg]
       )
#        t_
      df$truth_prior[df$Item==arg] <- out[1]
       )[1]
      df$sensitivity[df$Item==arg] <- out[2]
#      df$truth_prior[df$Item==arg] <- out[1]
      df$specificity[df$Item==arg] <- out[3]
#      df$seprime[df$Item==arg] <- out[2]
#      df$specificity[df$Item==arg] <- out[3]
     }
     }
     if(df$class[df$Item==parent]=="relevance") {
     if(df$class[df$Item==parent]=="relevance") {
      r_ <- ifelse(df$colour[df$Item==parent]=="PRO",RELEVANCE_FACTOR_R, -RELEVANCE_FACTOR_R)
#      r_ <- ifelse(df$colour[df$Item==parent]=="PRO",RELEVANCE_FACTOR_R, -RELEVANCE_FACTOR_R)
       out <- update_relevance(param_vector = c(
       df$seprime[df$Item==arg] <- update_relevance(
         df$truth_prior[df$Item==arg],
         df$truth_prior[df$Item==parent],
         df$sensitivity[df$Item==arg],
         df$seprime[df$Item==arg],
         df$specificity[df$Item==arg]),
         df$seprime[df$Item==parent]
        r_)
      )
      df$truth_prior[df$Item==arg] <- out[1]
#        r_)
      df$sensitivity[df$Item==arg] <- out[2]
#      df$truth_prior[df$Item==arg] <- out[1]
      df$specificity[df$Item==arg] <- out[3]
#      df$sensitivity[df$Item==arg] <- out[2]
#      df$specificity[df$Item==arg] <- out[3]
     }
     }
   }
   }
Rivi 305: Rivi 328:


prepare_graph <- function(df=df) {
prepare_graph <- function(df=df) {
   df$edge.penwidth <- abs(log(df$fbplus))*5
   df$edge.penwidth <- abs(df$seprime*15)
df$node.width <- df$truth_post*0.7
  df$node.width <- df$truth_prior
   df$node.fontsize <- df$truth_post*15
   df$node.fontsize <- df$truth_prior*15
   df$node.color <- ifelse(df$class=="truth","red","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$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(log(df$fbplus)) < RELEVANCE_LIMIT, "ir", ""), df$rel)
   df$rel <- paste0(ifelse(abs(df$seprime) < 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_post<TRUTH_LIMIT | abs(log(df$fbplus))<RELEVANCE_LIMIT) & df$level>0]
   drop <- df$Item[(df$truth_prior<TRUTH_LIMIT | abs(df$seprime)<RELEVANCE_LIMIT) & df$level>0]
  print(drop)
   out <- character()
   out <- character()
   for(i in na.omit(drop)) {
  tmp <- drop
     if(length(grep(i, drop))==1) out <- c(out, i)
   for(i in sort(na.omit(drop))) {
    branch <- tmp[grep(paste0("^",i), tmp)]
     if(length(branch)>0) {
      print(branch)
      out <- c(out, branch[1])
      tmp <- tmp[!tmp %in% branch[-1]]
    }
   }
   }
   drop <- out
   drop <- out
  print(drop)
   df$node.fillcolor <- "white"
   df$node.fillcolor <- "white"
   for(i in drop) {
   for(i in drop) {

Versio 28. heinäkuuta 2021 kello 08.44




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

Laskenta

Piirrä näkemysverkko Kialon koronakeskustelusta

Argumentaatio koskien koronarokotusten pakollisuutta.

Koronakide-hankkeeseen liittyen tehdään näkemysverkkoja koronarokotusten 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 eli A+ 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).

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

P(A+|B) / P(A-|B) = P(B|A+)P(A+)/P(B) / (P(B|A-)P(A-)/P(B))
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

O(A|B) = F(B) O(A).

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.

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 herkkyys eli kuinka vähän tulee vääriä negatiivisia: se = P(B+|A+) = a/(a+c)

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.

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
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

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

se = 0.29/0.30 = 29/30

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|Cr) = F(B) Π R(Cr), jossa Cr 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:

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):

a' = a+t*
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.

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:

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).

Parametrisoidaan tämä niin, että t* ja r* lasketaan parametreista t ja r, jotka voivat saada arvoja ]-1 .. 1[, jolloin

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+) ⇤--arg3163: . Vaikeaa. --Jouni Tuomisto (keskustelu) 26. heinäkuuta 2021 kello 21.04 (UTC) (type: ; paradigms: science: attack)
se = a/(a+c) <=> a = se(A+), joten b = B+ -se(A+), c = A+-se(A+), d=1-A+-B+ +se(A+) ←--arg5025: . Tämä toimii. --Jouni Tuomisto (keskustelu) 26. heinäkuuta 2021 kello 21.04 (UTC) (type: ; paradigms: science: defense)

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.

+ Näytä koodi

Hae kirjanmerkit Firefoxista

+ Näytä koodi

Katso myös