Drow Matron Mother
Medium humanoid (elf), neutral evil
Armor Class 17 (half plate)
Hit Points 262 (35d8 + 105)
Speed 30 ft.
| STR | DEX | CON | INT | WIS | CHA |
|---|---|---|---|---|---|
| 12 (+1) | 18 (+4) | 16 (+3) | 17 (+3) | 21 (+5) | 22 (+6) |
Saving Throws Con +9, Wis +11, Cha +12
Skills Insight +11, Perception +11, Religion +9, Stealth +10
Condition Immunities charmed, frightened, poisoned
Senses darkvision 120 ft., passive Perception 21
Languages Elvish, Undercommon
Challenge 20 (25,000 XP)
Fey Ancestry. The drow has advantage on saving throws against being charmed, and magic can’t put the drow to sleep.
Innate Spellcasting. The drow’s innate spellcasting ability is Charisma (spell save DC 20). She can innately cast the following spells, requiring no material components:
- At will: dancing lights, detect magic
- 1/day each: clairvoyance, darkness, detect thoughts, dispel magic, faerie fire , levitate (self only), suggestion
Lolth’s Fickle Favor. As a bonus action, the matron can bestow the Spider Queen’s blessing on one ally she can see within 30 feet of her. The ally takes 7 (2d6) psychic damage but has advantage on the next attack roll it makes until the end of its next turn.
Magic Resistance. The drow has advantage on saving throws against spells and other magical effects.
Spellcasting. The drow is a 20th-level spellcaster. Her spellcasting ability is Wisdom. The drow has the following cleric spells prepared:
- Cantrips (at will): guidance, mending, resistance, sacred flame , thaumaturgy
- 1st level (4 slots): bane, command, cure wounds, guiding bolt
- 2nd level (3 slots): hold person, silence, spiritual weapon
- 3rd level (3 slots): bestow curse, clairvoyance, dispel magic, spirit guardians
- 4th level (3 slots): banishment, death ward, freedom of movement, guardian of faith
- 5th level (3 slots): contagion, flame strike , geas, mass cure wounds
- 6th level (2 slots): blade barrier, harm
- 7th level (2 slots): divine word, plane shift
- 8th level (1 slot): holy aura
- 9th level (1 slot): gate
Sunlight Sensitivity. While in sunlight, the drow has disadvantage on attack rolls, as well as on Wisdom (Perception) checks that rely on sight.
Actions
Multiattack The matron mother makes two demon staff attacks or three tentacle rod attacks.
Demon Staff Melee Weapon Attack: +10 to hit, reach 5 ft., one target. Hit: 7 (1d6 + 4) bludgeoning damage, or 8 (1d8 + 4) bludgeoning damage if used with two hands, plus 14 (4d6) psychic damage. In addition, the target must succeed on a DC19 Wisdom saving throw or become frightened of the drow for 1 minute. The frightened target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success.
Tentacle Rod Melee Weapon Attack: +9 to hit, reach 15 ft., one target. Hit: 3 (1d6) bludgeoning damage. If the target is hit three times by the rod on one turn, the target must succeed on a DC 15 Constitution saving throw or suffer the following effects for 1 minute: the target’s speed is halved, it has disadvantage on Dexterity saving throws, and it can’t use reactions. Moreover, on each of its turns, it can take either an action or a bonus action, but not both. At the end of each of its turns, it can repeat the saving throw, ending the effect on itself on a success.
Summon Servant (1/Day) The drow magically summons a retriever or a yochlol. The summoned creature appears in an unoccupied space within 60 feet of its summoner, acts as an ally of its summoner, and can’t summon other demons. It remains for 10 minutes, until it or its summoner dies, or until its summoner dismisses it as an action.
Legendary Actions
The drow can take 3 legendary actions, choosing from the options below. Only one legendary action option can be used at a time and only at the end of another creature’s turn. The drow regains spent legendary actions at the start of her turn.
Demon Staff The drow makes one attack with her demon staff.
Compel Demon (Costs 2 Actions) An allied demon within 30 feet of the drow uses its reaction to make one attack against a target of the drow’s choice that she can see.
Cast a Spell (Costs 1-3 Actions) The drow expends a spell slot to cast a 1st-, 2nd-, or 3rd-level spell that she has prepared. Doing so costs 1 legendary action per level of the spell.


News.
I am recuriting a few Ph.D students for Fall 2024. Drop me a note if you are interested!
I am recuriting a few Ph.D students for Fall 2024. Drop me a note if you are interested!
I am a Assistant Professor in Computer Science at Johns Hopkins University and a Postdoctoral Researcher in the Fairness, Accountability, Transparency, and Ethics group at Microsoft Research Montréal. I completed my Ph.D in Computer Science at the University of Illinois Urbana-Champaign. I was co-advised by Prof. Hari Sundaram and Prof. Karrie Karahalios
My research is motivated by the fundamental question of understanding humans at scale, e.g., how could we conduct robust and generalizable studies about human behavior? My goal is to enhance the human-AI interaction to expand our knowledge about ourselves. Through my research, I hope to create a more connected research community and democratize novel technologies to operationalize intuitions and curiosities about how we think and behave.
I also work on other exciting topics such as information seeking, behavioral change, online spaces, and human cognitive skills. Broadly, my work lies in the intersection of human computer interaction, natural language processing, and social and personality psychology.


--- layout: post title: 10 reasons Telegram founder ‘thinks’ using WhatsApp is dangerous | Gadgets Now date: '2020-02-03T20:00:00.001+05:30' author: Sahil Rajput tags: modified_time: '2020-02-03T20:00:25.998+05:30' blogger_id: tag:blogger.com,1999:blog-5250005448924290719.post-8870363723131513513 blogger_orig_url: https://www.jaadujinn.ml/2020/02/10-reasons-telegram-founder-thinks.html ---


SYMPTOMS OF ALZHEIMER'S
MEMORY LOSS THAT DISRUPTS DAILY LIFE
DIFFICULTY DOING FAMILIAR TASKS
DIFFICULTY IN IDENTIFYING PLACE AND TIME


kml.overlay
Overlays an image over the earth surface.
Contents
Syntax
kml.overlay(west, east, south, north, 'file','image.jpg') kml.overlay(...,'PropertyName',PropertyValue,...)
Description
Overlays the image file (specified by the property pair 'file','image.jpg') as a ground overlay in the kml file. The corners of the image are given by inputs west, east, south and north.
To make the overlay transparent, change the alpha portion of the color parameter to a different hex value - eg.: 50% transparent, use kml.overlay(...,'color','80FFFFFF')
The units for west, east, south and north are normally given in degrees, but this can be changed by calling: kml.useDegrees; or kml.useRadians; before plotting.
It is possible to fine tune the overlay properties using name-value pairs:
kml.overlay(...,'PropertyName',PropertyValue,...)
Properties
| Property Name | Type | Description |
|---|---|---|
| 'file' | string | Path to the image that should be overlayed. This is a required input. |
| 'name' | string | Name of the overlay in the kml file |
| 'id' | string | Internal id of this overlay inside the kml |
| 'description' | string | A short description of what the overlay represents |
| 'visibility' | true/false | Control the initial visibility of the overlay |
| 'color' | kml color string | Defines the color of the overlay. Must be a valid hex color string input, in the style AABBGGRR |
| 'altitude' | double | Altitude where the overlay should be plotted. Input in meters. |
| 'altitudeMode' | string | Choose if the altitude value is absolute to the earth model, relative to the ground level, or should be clamped to the ground. Valid inputs: 'absolute', 'relativeToGround', 'clampToGround' |
| 'drawOrder' | double | In case more than one overlay is placed in the same location, this input defines the order on which they should be draw. |
| 'rotation' | double | Specifies a rotation of the overlay about its center. Values can be ±180° or ±pi, depending on the active unit. The default is 0 (north). Rotations are specified in a counterclockwise direction. |
| 'timeStamp' | kml date string | Associates the polygon to a moment in time. Should not be used together with timeSpan. Should be a string in the XML time format (more information available here) |
| 'timeSpanBegin' | kml date string | Defines the moment in time where the polygon starts to exist. Should not be used together with timeStamp. Should be a string in the XML time format (more information available here) |
| 'timeSpanEnd' | kml date string | Defines the moment in time where the polygon finishes to exist. Should not be used together with timeStamp. Should be a string in the XML time format (more information available here) |
Example
% Create a new kml object k = kml('my kml file'); warning('off','MATLAB:nonIntegerTruncatedInConversionToChar') % Place some images overlays over the earth dimg = pow2(get(0,'DefaultImageCData'),47); ee = reshape([47,42,37,36,35,34,33,28,23,18,13,9,5,1,-1,51,46,41,... 36,35,34,33,32,27,22,16,12,8,4,-1,33.8562,43.3,41.3,... 54.7167,23.35,17,21.17,33.8562,49.45,41.3,40.4296,... 35.7143,33.8562,35.0839,-22.007,-85.2163,-70.3504,... -72.3504,20.5167,90.7083,17,72.83,-83.2163,11.0833,-70.3504,... -79.9191,-83.5102,-84.2163,-106.6186,-47.8974],[15 4]); en = reshape([111,[1:2]*0+77,72,77,116,97,121,77,56,46,87,97,116,111,108, ... [1:2]*0+84,105,84,104,32,111,101,45,46,105,110,104,32,100,... [1:2]*0+87,108,87,101,83,117,108,98,46,108,100,101,112,101,... [1:2]*0+32,98,[1:2]*0+32,105,110,97,105,32,107,[1:2]*0+32,... 111,115,[1:2]*0+100,101,111,110,97,103,110,116,111,105,116,... 111,114,116,[1:2]*0+111,114,108,117,109,101,99,115,[1:2]*0+110,... 104,114,99,32,[1:2]*0+103,116,100,109,101,115,111,[1:2]*0+32,115,... 101,105,111,108,[1:4]*0+32,98,115,116,108,115,116,111,32,103,32,... 105,49,50,109,108,[1:2]*0+101,32,105,116,104,110,98,105,97,116,... [1:2]*0+-1,97,111,114,32,108,97,105,101,44,105,110,109,116,... [1:2]*0+-1,116,103,-1,109,105,44,108,[1:2]*0+32,103,[1:2]*0+97,... 108,[1:2]*0+-1,114,111,-1,97,116,32,108,97,71,32,108,114,101,... [1:2]*0+-1,105,[1:2]*0+-1,103,116,98,32,114,105,69,32,101,32,... [1:2]*0+-1,120,[1:2]*0+-1,105,108,121,114,116,118,100,119,108,69,... [1:5]*0+-1,99,101,32,117,32,101,100,97,111,100,[1:5]*0+-1,... [1:2]*0+32,65,108,111,110,105,115,44,100,[1:5]*0+-1,115,69,... 108,101,102,115,110,[1:2]*0+32,105,[1:5]*0+-1,113,100,98,115,... [1:2]*0+32,115,97,109,110,[1:5]*0+-1,117,100,114,-1,77,38,-1,... 108,97,115,[1:5]*0+-1,97,105,101,-1,65,32,-1,119,115,[1:6]*0+-1,... 114,110,99,-1,84,70,-1,97,32,[1:6]*0+-1,101,115,104,-1,76,111,... -1,121,110,[1:8]*0+-1,116,-1,65,114,-1,115,227,[1:8]*0+-1,32,... -1,66,115,-1,32,111,[1:8]*0+-1,68,[1:2]*0+-1,121,-1,116,32,... [1:8]*0+-1,117,[1:2]*0+-1,116,-1,104,111,[1:8]*0+-1,114,... [1:2]*0+-1,104,-1,101,32,[1:8]*0+-1,101,[1:2]*0+-1,101,-1,... 114,100,[1:8]*0+-1,114,[1:4]*0+-1,101,111,[1:14]*0+-1,32,... [1:14]*0+-1,67,[1:14]*0+-1,65,[1:14]*0+-1,65,[1:14]*0+-1,83,... [1:14]*0+-1,79],[15 35]); for i = 1:size(ee,1) fn = sprintf('ee%i.jpg',i); if i<size(ee,1) img = bitslice(dimg,ee(i,1),ee(i,2)); img = img-min(img(:))./(max(img(:))-min(img(:))); imwrite(img*2^6,gray,fn); else r = bitslice(dimg,0,0); g = bitslice(dimg,17,17); b = bitslice(dimg,34,34); imwrite(cat(3,r,g,b),fn) end n = char(en(i,:)); k.overlay(ee(i,4)-0.5,ee(i,4)+0.5,ee(i,3)-0.5/secd(ee(i,3)),ee(i,3)+0.5/secd(ee(i,3)), ... 'file',fn,'color','FFFFFFFF','name',n) end % Save the kml and open it in Google Earth k.run;
This is the result of running this example:
This file is part of the kml toolbox. Copyright 2012 Rafael Fernandes de Oliveira (rafael@rafael.aero)


| Vendor Name: | Sharp Electronics Of Canada Ltd. |
|---|---|
| Reference Number: | 20160028SS |
| Contract Date: | 2016-03-10 |
| Description of Work: | 0533 Rental Machinery, Office Furn/fixtures & Other Eq. |
| Contract Period: | 2016-04-01 to 2021-03-31 |
| Delivery Date: | 2021-03-31 |
| Contract Value: | $30,844.80 |
| Comments: | Contract Awarded By Ssc - Multifunction Devices For Yro. This Contract Was Competitively Sourced. This Contract Is A Multi-Year Contract. This Contract Was Awarded By Public Services And Procurement Canada. |


This test demonstrates that window.location.hash automatically performs URI decoding when read. The issue then is that setting a value and reading a value is not symetric. Also see comment at goog.History.prototype.getLocationFragment_.
The outcome is that goog.history.setToken/getToken should be the way to work with hash-based history (as it is symetric)


As ELMS:LN is moving towards using webcomponents for many of its designs, some developers may wish to develop these tools on their own using the polymer-cli project. This guide is a step-by-step guide on how to set up polymer-cli on your local machine for development purposes:
npm
curl -L https://www.npmjs.com/install.sh | sh
npm
is installed you will want to install the
nvm
package manager. this allows you to switch between different versions of
npm
.nvm
and
npm
are installed, you are ready to begin installing polymer-clinvm use 4.1.2
to switch your version of node to 4.1.2.npm install -g polymer-cli
to download polymer-cli to your local machine. This may take a few minutes...mkdir example
cd example
polymer init


SAFER+ is the proposal of Cylink Corporation for the Advanced Encryption Standard, and its description is available at http://www.cylink.com/internet/library.nsf/pages/SAFER/. It is very similar to the original 64-bit block cipher SAFER.
The following diagram shows one round of SAFER+:
it uses the same S-boxes as SAFER in the same way. Instead of the regular "butterfly" formation of Pseudo-Hadamard Transforms used in the original SAFER, a slightly irregular arrangement is used, so that the net result of the operations, given in the document as the matrix M (it stated that that matrix could be realized by a four-layer PHT network similar to the three-layer one in SAFER, but did not give the network; thus this diagram rectifies the omission) has certain desirable properties.
One other improvement in SAFER+ over SAFER is that after matrix M is applied in the last round, one extra subkey is applied to the block, using the same sequence of alternating XORs and additions as is used for the first subkey in a round. This means that the final application of matrix M is not a waste of time in terms of cryptographic security.
For a key length of 128 bits, 8 rounds are used; for 192 bits, 12 rounds; and for a 256-bit key, SAFER+ has 16 rounds.
The key schedule of SAFER+ is quite simple. The key, whatever its length, has one byte appended to it, equal to the XOR of all the bytes in the key.
The first subkey consists of the first 16 bytes of the key. For each remaining subkey, first rotate the expanded key left 11 bits, then take the first 16 bytes of the result, and use them after XORing them with a constant. I am not reproducing the constants here; the paper describing SAFER+ gives them, but in decimal form.


Toggle navigation
Readers' Advisory blog
About this blog
Browse by topics
Contact
Publications
A discovery of witches by …
March 18, 2018
About the book Author: Harkness, Deborah E., 1965- Title: A discovery of witches; Series: All souls trilogy A discovery of witches (DA41609, ISBN9780670022410), 2011, read by …
The untold by Courtney …
August 14, 2017
About the book Author: Collins, Courtney. Title: The untold Publication: New York : Amy Einhorn Books, Published by G.P. Putnam’s Sons, a member of Penguin Group (USA), 2014. …
Crosstalk by Connie …
April 4, 2017
About the book Author: Willis, Connie. Title: Crosstalk. Publication: New York : Del Rey, [2016]. ISBN<PHONE_NUMBER>676. DAISY audio format narrated by Mia Barron. CELA library call …
The Swallow: A ghost …
January 1, 2017
About the book Author: Cotter, Charis. Title: The swallow : A ghost story Publication: Toronto : Tundra Books, 2014. ISBN<PHONE_NUMBER>913. DAISY audio format available on Bookshare. …
Thornyhold by Mary …
December 1, 2016
About the book Author: Stewart, Mary. Title: Thornyhold. Publication: London ; Toronto : Hodder & Stoughton, 1988. ISBN<PHONE_NUMBER>. DAISY audio format narrated by Pauline …
Lavinia by Ursula K. Le …
October 22, 2016
About the book Author: Le Guin, Ursula K. Title: Lavinia Publication: Orlando : Harcourt, 2008. ISBN<PHONE_NUMBER>621. DAISY audio format narrated by Alyssa Bresnahan. CELA library …


Feature #476
tag clouds
| Status: | New | Start: | 08/03/2011 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assigned to: | - | % Done: | 0% |
|
| Category: | Programming | |||
| Target version: | 0.0.5 |
Description
This is another rollover from #360, but it got left behind somehow. A tag cloud is a dict-like object containing {'tag-name':frequency-of-use,...}. It's fun to have them to see all the tags that people are using publicly on an instance.
Where would we display these?- instance home page - all users, processed media
- user's profile - user's processed media
- [BONUS] - arbitrary collection (/tags/bunnies)
- Should we use MapReduce? http://cookbook.mongodb.org/patterns/count_tags/ The alternative would be to write tags to a text file and do
sort tags_text_file | uniq -c
or do it completely within python - Should we use celery? Generating tag clouds shouldn't slow page renders. Thoughts:
do it with python if you're using MapReduce since, if MapReduce gets too slow, you just add more processors!
if it 'takes too long', then use celery
- How often do we update the clouds? Thoughts included:
not during a bulk upload
- How do we store these tag cloud objects? If we're not rendering them on the fly, then they should be in some kind of cache. Thoughts:
user['tag_cloud'] = dict
associate the cloud with the route. something like - {'/':'instance_cloud.txt','/u/user1':'user1_cloud.txt','/tags/bunnies':'tags_bunnies.txt'}
Related issues
| related to Feature #507: Use beaker as a caching abstraction layer | New | 08/22/2011 | ||
| related to Feature #502: Add tag list to user profile | New | 08/20/2011 | ||
| blocked by Feature #456: Consider cache "table" | New | 07/26/2011 |
History
Updated by Caleb Davis 26 days ago
I haven't gone through the code in this one yet, but the feature set is interesting: http://pypi.python.org/pypi/cs.tags


I recently gave to my students a data science assignment with a dataset to do some data wrangling, descriptive statistics and hypotheses testing. In order to give some context to the dataset, I also asked them to write a short introduction and to formulate hypotheses supported by academic references. While the focus of the assignment is not on these references, I found suspicious that some students used the exact same references while changing the text to bypass plagiarism software.
I was very curious to see if it is possible to identify groups of students using the same references. I came across a very interesting blog post by María Medina Pérez called “Graph Theory 101 with corruption cases in Spain”. I won’t say that my students are involved in corruption cases but there are some similarities in the process: each student correspond to a case and each author reference correspond to an accused. By following this principle, it is possible to map the network of relationship of shared author references between students.
Data Wrangling
First, let’s load the packages:
library(tidyverse) # data wrangling function + pipe
library(pdftools) # pdf scrapping
library(here) # relative project paths
library(combinat) # combination of vectors
library(igraph) # network analysis and vitalization
library(fs) # batch path processing
Then, let’s read some data taken from student’s references section. To make it easy in this post, the data are already saved in a .csv file but you will find my procedure to obtain this table here below commented:
# # function -------------------------------------------------------------------
# pdf_process <- function(file_path){
# file_text <- pdf_text(file_path)
# file_text[length(file_text)] %>%
# str_split("\r\n", n = Inf, simplify = TRUE) %>%
# t() %>%
# as_tibble() %>%
# rename(ref = V1) %>%
# mutate(ref_date = str_extract(ref, "(?<=\\().+?(?=\\))") %>% as.numeric) %>%
# filter(between(ref_date, 1455, format(Sys.Date(), "%Y"))) %>%
# mutate(
# first_author =
# str_extract(ref, "^[^\\(]+") %>% # split by opening brackets
# str_replace_all("[^[:alnum:] ]", "") %>% # remove all non-letter
# str_squish() %>% # trim beginning white spaces
# word(sep = fixed(" ")), # keep only first word
# id = stri_rand_strings(1, 5) # generate random string
# )
# }
# # data -----------------------------------------------------------------------
# data_raw <- "./assignment/individual_report/submission" %>%
# dir_ls(regexp = "\\.pdf$", recurse = TRUE) %>%
# path_filter(regexp = "\\_dd.pdf$", invert = TRUE) %>%
# map_dfr(pdf_process) %>%
# write_csv(here("data/data_raw.csv"))
data_raw <- here("static/files/data_network.csv") %>%
read_csv()
list_unique_author <- unique(data_raw$first_author) # author used in the reference section
list_unique_id <- unique(data_raw$id) # student custom ID for anonymity
Now we have a list of authors and a list of student IDs, we are going to build two main dataframes:
* A dataframe that combines all the possible pairs of authors and measure how many times they appears together in the same document (called authors_same_id_df)
* A dataframe that combines all the possible pairs of students IDs and measure how many authors they have in common (called ids_same_author_df)
Basic Network of Shared IDs
To proceed, create a vector of all IDs having more than one author and count how many times a pair of author appears in a student ID:
Then, use the package {igraph} to create a basic network from the dataframe by using the function … graph_from_data_frame(). The second step consist in using the function E() to weight the edges of the network according the number of times that a pair of author appears in student IDs:
Similarly, create a vector of all authors that appear in more than one student ID document and count how many authors are shared by pairs of student IDs:
Because we are more interest in grouping similarity between students’ document, the following code aims to identify clusters in student IDs’ network.
Connected Components
By using the functions components() and sizes(), the objective is to bring together nodes that are strongly connected (high density of shared authors).
In order to organize the final plot, it is essential to remove all relationships with only 1 element. Then, two subgraphs are prepared one containing all the connections g_author_plots (minus weak relationships) and one containing only the strongest connections g_author_plot1. Finally, the layout of the final graph is prepared with student IDs connections in layout_id_plot1 using the layout_nicely() function.
{igraph} also provides an easy network clustering function called cluster_walktrap(). This function will define the clusters in the network to draw the circles.


Welcome on form
Today we make it looks wired
Awesome form
Input
Select
Select car:
Audi
BMW
Citroen
Ford
Honda
Jaguar
Land Rover
Mercedes
Mini
Nissan
Toyota
Volvo
One
Fore
Two
One
Fore
Two
File picker
Slider
Textarea
Toggle
Cancel Link
Submit


--- layout: post title: Firefox OS now in our Watch date: 2015-01-10 22:30:13.000000000 +05:30 type: post published: true status: publish categories: - Android - Firefox OS tags: - Firefox - Firefox OS meta: _thumbnail_id: '379' _rest_api_published: '1' _rest_api_client_id: "-1" _publicize_pending: '1' publicize_facebook_url: https://facebook.com/521066101241445_995882287093155 publicize_linkedin_url: https://www.linkedin.com/updates?discuss=&scope=72621861&stype=M&topic=5959808622727872512&type=U&a=A6z1 _wpas_done_5327596: '1' _publicize_done_external: a:1:{s:8:"facebook";a:1:{i:100000377806894;b:1;}} publicize_google_plus_url: https://plus.google.com/108982000212947208802/posts/e7DGHJ6cckG _wpas_done_9797179: '1' publicize_twitter_user: iamVP7 publicize_twitter_url: http://t.co/jy2OiHAcgP _wpas_done_5327584: '1' _wpas_done_5327600: '1' publicize_tumblr_url: http://mobosedu.tumblr.com.tumblr.com/post/107728122420 _wpas_done_9797552: '1' _wpas_path_publicize_failure: O:13:"Keyring_Error":2:{s:16:" publicize_path_id: '' author: login: viswaprasath email<EMAIL_ADDRESS>display_name: Vitchu first_name: '' last_name: '' excerpt: Firefox OS in all screen sized devices and it is very awesome. ---
Recently we have seen how the Firefox OS is available in very big screens. Now we can also see how it will be covering the future of consumer Electronics. Firefox OS is made for all screen.
In 2014 we have seen Google's Android based smart watch and the module to develop apps has been integrated in the Android Studio beta to help developers in Google IO and Apple's iOS based Apple watch in WWDC, it is estimated that in 2015 there will be launch of WebOS based. At this time Firefox has shown just the basic prototype how it's watch will be. In the Consumer Electronics Show 2015 Mozilla team has shown the prototype of Firefox OS based watch.It is very exciting to see the prototype we have seen in the Youtube video.
[caption id="attachment_379" align="aligncenter" width="416"] Smart Watch with Firefox OS[/caption]
There was another interesting scene in the video where there was a integration of Firefox OS in Washing machine and controlling the various processes of washing machine from the watch itself.
[caption id="attachment_380" align="aligncenter" width="394"] Controlling Washing machine using Firefox OS based Watch[/caption]
Future path which is going to be covered by Firefox OS is very interesting it will be very exciting to see many house hold devices integrated with Firefox OS.
[embed]https://www.youtube.com/watch?v=5cLnLM0egCY[/embed]


In any programmable instrument, it is easy to lose important information if you press the wrong button. You've created a new sound, and you store it under the wrong number, losing another {_program}. In the Digital Chroma (as in the original Chroma), it is also easy to lose a bunch of edits you've made to a program but haven't saved yet by selecting a new program, because you tried to select a {_parameter} but didn't notice that you had put the panel back into PROG SELECT mode.
The solution to this is Undo. Since the Digital Chroma never goes out of tune, the AUTO TUNE switch has been appropriated for this purpose. Any time you do the wrong thing from the control panel, just press AUTO TUNE and it undoes the last thing you did, and briefly shows what it undid in the display. Press it repeatedly and step backward through time as far as you want. The undo buffer is usually large enough to hold everything you changed since you turned the instrument on.
Here are the things that you can undo:
If you go back in time by many steps, it's also easy to go too far. If you do that, the solution is Redo, which is invoked with SET SPLIT, AUTO TUNE. This redoes the last thing you undid, and briefly shows what it redid in the display. You can repeat this operation until you've gone all the way back to the "present", and there is nothing more to redo. But be aware that as soon as you perform any of the functions listed above, the redo buffer is discarded, and you can only undo.
The Undo/Redo mechanism records all changes regardless of whether they come from the Digital Chroma panel or the Toolkit. Undo and Redo can also be invoked by the Toolkit.


Born and raised in Tamil Nadu. Excited by Technology. Loves to travel and to capture moments with camera.
In short, I am a Technology Enthusiast, Developer, Traveller, Photographer.
Have worked for a few companies in this span to gain exposure on different domains.
M.Sc Software Engineering
PSG College of Technology, Coimbatore
Higher Secondary School
R.S.K Higher Secondary School, Trichy
Secondary School
Chinmaya Vidhyalaya Matriculation School, Trichy
I have the privilege to work with these cool companies.
Goldman Sachs, Bangalore
New Associate Programmer Analyst.
Goldman Sachs, Bangalore
Technology Intern
KLA Tencor, Chennai
Technology Intern
Goldman Sachs, Bangalore
Technology Intern
Armor Technologies
Android Application Developer Intern


causal inference
Contents
4.4. causal inference#
Some notes on causal inference both from the following resources:
introductory courses following neyman-rubin framework at UC Berkeley
the textbook What if (hernan & robins)
the book of why
in-progress book by brady neal
course notes by stefan wager
rebecca barter’s blog posts
wonderful review / intro paper (guo et al. 2020)
4.4.1. basics#
confounding = difference between groups other than the treatment which affects the response
this is the key problem when using observational (non-experimental) data to make causal inferences
problem occurs because we don’t get to see counterfactuals
ex from Pearl where Age is the confounder
potential outcomes = counterfactual outcomes \(Y^{t=1}, Y^{t=0}\)
treatment = intervention, exposure, action
potential outcomes are often alternatively written as \(Y(1)\) and \(Y(0\)) or \(Y_1\) and \(Y_0\)
alternatively, \(P(Y=y|do(T=1))\) and \(P(Y=y|do(T=0))\) or \(P(Y=y|set(T=1))\) and \(P(Y=y|set(T=0))\)
treatment \(T\) and outcome \(Y\) (from “What If”):
different approaches to causal analysis
experimental design: collect data in a way that enables causal conclusions
ex. randomized control trial (RCT) - controls for any possible confounders
quasi-experiments: without explicit random assignment, some data pecularity approximates randomization
ex. regression discontinuity analysis
ex. instrumental variables - variable which can be used to effectively due a RCT because it was made random by some external factor
post-hoc analysis: by arguing that certain assumptions hold, we can draw causal conclusions from non-observational data
ex. regression-based adjustment after assuming ignorability
some assumptions are not checkable, and we can only reason about how badly they can go wrong (e.g. using sensitivity analysis)
background
very hard to decide what to include and what is irrelevant
epiphenomenon - a correlated effect (not a cause)
a secondary effect or byproduct that arises from but does not causally influence a process
ontology - study of being, concepts, categories
nodes in graphs must refer to stable concepts
ontologies are not always stable
world changes over time
“looping effect” - social categories (like race) are constantly chainging because people who putatively fall into such categories to change their behavior in possibly unexpected ways
epistemology - theory of knowledge
clear distinction between identification and estimation (and third problem is discovery - what is the structure?)
a causal quantity is identifiable if we can compute it from a purely statistical quantity
<IP_ADDRESS>. intuition#
bradford hill criteria - some simple criteria for establishing causality (e.g. strength, consistency, specificity)
association is circumstantial evidence for causation
no causation without manipulation (rubin, 1975; Holland, 1986)
in this manner, something like causal effect of race/gender doesn’t make sense
can partially get around this by changing race \(\to\) perceived race
weaker view (e.g. of Pearl) is that we only need to be able to understand how entities interact (e.g. write an SEM)
different levels
experiment: experiment, RCT, natural experiment, observation
evidence: marginal correlation, regression, invariance, causal
inference (pearl’s ladder of causality): prediction/association, intervention, counterfactuals
kosuke imai’s levels of inference: descriptive, predictive, causal
<IP_ADDRESS>. measures of association#
correlation
regression coefficient
risk difference = \(P(Y=1|T=1) - P(Y=1|T=0)\)
risk ratio = relative risk = \(P(Y=1|T=1) / P(Y=1|T=0)\)
odds ratio = \(\frac{P(Y=1|T=1) / P(Y=0|T=1)}{P(Y=1|T=0) / P(Y=0|T=0)}\)
measures association (1 is independent, >1 is positive association, <1 is negative association)
odds that \(P(Y=1)\) = \(P(Y=1)/P(Y \neq 1)\)
<IP_ADDRESS>. causal ladder (different levels of inference)#
prediction/association \(P(Y|T)\)
only requires joint distr. of the variables
intervention \(P(Y^{T=t}) = P(Y|do(T=t))\)
we can change things and get conditionals based on evidence after intervention
represents the conditional distr. we would get if we were to manipulate \(t\) in a randomized trial
to get this, we assume the causal structure (can still kind of test it based on conditional distrs.)
having assumed the structure, we delete all edges going into a do operator and set the value of \(x\)
then, do-calculus yields a formula to estimate \(p(y|do(x))\) assuming this causal structure
see introductory paper here, more detailed paper here (pearl 2013)
by assuming structure, we learn how large impacts are
counterfactuals \(P(Y^{T=t'} = y'|T=t, y=y)\)
we can change things and get conditionals based on evidence before intervention
instead of intervention \(p(y|do(x))\) we get \(p(y^*|x^*, u=u)\) where \(u\) represents fixing all the other variables and \(y^*\) and \(x^*\) are not observed
averaging over all data points, we’d expect to get something similar to the intervention \(p(y|do(x))\)
probabalistic answer to a “what would have happened if” question
e.g. “Given that Hillary lost and didn’t visit Michigan, would she win if she had visited Michigan?”
e.g. “What fraction of patients who are treated and died would have survived if they were not treated?”
this allows for our intervention to contradict something we condition on
simple matching is often not sufficient (need a very good model for how to match, hopefully a causal one)
key difference with standard intervention is that we incorporate available evidence into our calculation
available evidence influences exogenous variables
this is for a specific data point, not a randomly sampled data point like an intervention would be
requires SEM, not just causal graph
4.4.2. frameworks#
<IP_ADDRESS>. fisher randomization test#
this framework seeks evidence against the null hypothesis (e.g. that there is no causal effect)
fisher null hypothesis: \(H_{0F}: Y_i^{T=0} = Y_i^{T=1}\quad \forall i\)
also called strong null hypothesis = sharp null hypothesis (Rubin, 1980)
weak null hypothesis would be \(\bar Y_i^{T=0} = Y_i^{T=1}\)
can work for any test statistic \(test\)
only randomness comes from treatment variable - this allows us to get randomization distribution for a test-statistic \(test(T, Y^{T=1}, Y^{T=0})\)
this yields \(p\)-values: \(p= \frac 1 M \sum_{m=1}^M \mathbb 1 \{ test(\mathbf t^m, \mathbf Y) \geq test (\mathbf T, \mathbf Y) \}\)
can approximate this with Monte Carlo permutation test, with \(R\) random permutations of \(\mathbf T\): \(p= \frac 1 R \sum_r \mathbb 1 \{ test(\mathbf t^r, \mathbf Y) \geq test (\mathbf T, \mathbf Y) \}\)
canonical choices of test-statistic
difference in means: \(\hat \tau = \hat{\bar{Y}}^{T=1} - \hat{\bar{Y}}^{T=0}\)
\(= \frac 1 {n_1} \sum_i T_i Y_i - \frac 1 {n_0} \sum_i (1 - T_i) Y_i\)
\(= \frac 1 {n_1} \sum_{T_i=1} Y_i - \frac 1 {n_0} \sum_{T_i=0} Y_i\)
studentized statistic: $\(t=\frac{\hat \tau}{\sqrt{\frac{\hat S^2(T=1)}{n_1}+\frac{\hat S^2 (T=0)}{n_0}}}\)$
allows for variance to change between groups (heteroscedasticity)
wilcoxon rank sum: \(W = \sum_i T_i R_i\), where \(R_i = \#\{j : Y_j \leq Y_i \}\) is the rank of \(Y_i\) in the observed samples
the sum of the ranks is \(n(n+1)/2\), and the mean of \(W\) is \(n_1(n+1)/2\)
less sensitive to outliers
kolmogorov-smirnov statistic: \(D = \max_y|\hat F_1(y) - \hat F_0 (y)|\) where \(\hat F_1(y) = \frac 1 {n_1} \sum_i T_i 1(Y_i \leq y)\), \(\hat F_0(y) = \frac 1 {n_0} \sum_i (1 -T_i) 1(Y_i \leq y)\)
measures distance between distributions of treatment outcomes and control outcomes
alternative neyman-pearson framework has a null + alternative hypothesis
null is favored unless there is strong evidence to refute it
<IP_ADDRESS>. potential outcome framework (neyman-rubin)#
In this framework, try to explicitly compute the effect
average treatment effect ATE \(\tau = E \{Y^{T=1} - Y^{T=0} \}\)
individual treatment effect \(\Delta = Y_i^{T=1} - Y_i^{T=0}\)
conditional average effect \(= E\{Y^{T=1} - Y^{T=0}\}|X\)
estimator \(\hat \tau = \hat{\bar{Y}}^{T=1} - \hat{\bar{Y}}^{T=0}\)
unbiased: \(E(\hat \tau) = \tau\)
\(V(\hat \tau) = \underbrace{S^2(1) / n_1 + S^2(0)/n_0}_{\hat V(\tau) \text{ conservative estimator}} - S^2(\tau)/n\)
95% CI: \(\hat \tau \pm 1.96 \sqrt{\hat V}\) (based on normal approximation)
we could similarly get a p-value testing whether \(\hat \tau\) goes to 0, unclear if this is better
key assumptions: SUTVA, consistency, ignorability
strict randomization framework: only assume treatment assignment is take to be a random variable
alternatively assume population distr. from which potential outcomes are drawn
advantages over DAGs: easy to express some common assumptions, such as monotonicity / convexity
neyman-rubin model: \(Y_i = \begin{cases} Y_i^{T=1}, &\text{if } T_i=1\\Y_i^{T=0}, &\text{if } T_i=0 \end{cases}\)
equivalently, \(Y_i = T_i Y_i^{T=1} + (1-T_i) Y_i^{T=0}\)
\(\widehat{ATE} = \mathbb E [\hat{Y}^{T=1} - \hat{Y}^{T=0}]\)
\(\widehat{ATE}_{adj} = [\bar{a}_A - (\bar{x}_A - \bar{x})^T \hat{\theta}_A] - [\bar{b}_B - (\bar{x}_B - \bar{x})^T \hat{\theta}_B]\)
\(\hat{\theta}_A = \mathrm{argmin} \sum_{i \in A} (a_i - \bar{a}_A - (x_i - \bar{x}_A)^T \theta)^2\)
neyman-pearson
null + alternative hypothesis
can also take a bayesian perspective on the missing data
<IP_ADDRESS>. DAGs / structural causal models (pearl et al.)#
In this framework, depict assumptions in a DAG / SEM and use it to reason about effects. For notes on graphical models, see here and basics of do-calculus see here.
comparison to potential outcomes
easy to make clear exactly what is independent, particularly when there are many variables
do-calculus allows for answering some specific questions easily
often difficult to come up with proper causal graph, although may be easier than coming up with ignorability assumptions that hold
more flexibly extends to cases with many variables
DAGs quick review (more details here)
d-separation allows us to identify independence
A set \(S\) of nodes is said to block a path \(p\) if either
\(p\) contains at least one arrow-emitting node that is in \(S\)
\(p\) contains at least one collision node that is outside \(S\) and has no descendant in \(S\)
absence of edges often corresponds to qualitative judgements of conditional independence
disentangled factorization represented by the graph can use far fewer params
forks |
mediators |
colliders |
|---|---|---|
confounder \(z\), can be adjusted for |
confounder can vary causal effect |
conditioning on confounder z can explain away a cause |
structural causal model (scm) gives a set of variables \(X_1, ... X_i\) and and assignments of the form \(X_i := f_i(X_{parents(i)}, \epsilon_i)\), which tell how to compute value of each node given parents
exogenous variables \(\epsilon_i\) = noise variables = disturbances = errors - node in the network that represents all the data not collected
are not influenced by other variables
modeler decides to keep these unexplained
not the same as the noise term in a regression - need not be uncorrelated with regressors
direct causes = parent nodes
the \(:=\) notation signifies a direction
controlling for a variable (when we have a causal graph):
\(P(Y=y|do(T:=t)) = \sum_z \underbrace{P(Y=y|T=t, T_{parents}=z)}_{\text{effect for slice}} \underbrace{P(T_{parents}=z)}_{\text{weight for slice}}\)
post-intervention distribution \(P(z, y|do(t_0))\) - result of setting \(T = t_0\)
also called “controlled” or “experimental” distr.
counterfactual \(Y^{T=t}(x)\) under SCM can be explicitly computed
given structural causal model M, observed event x, action T:=t, target variable Y, define counterfactual \(Y^{T=t}(x)\) in 3 steps:
abduction - adjust noise variables to be consistent with \(x\)
action - perform do-intervention, setting \(T=t\)
prediction - compute target counterfactual, which follows directly from \(M_t\), model where action has been performed
counterfactuals can be derived from the model, unlike potential outcomes framework where counterfactuals are taken as primitives (e.g. they are undefined quantities which other quantities are derived from)
identifiability
effects are identifiable whenever model is Markovian
graph is acyclic
error terms are jointly independent
in general, parents of \(X\) are the only variables that need to be measured to estimate the causal effects of \(X\)
in this simple case, \(E(Y|do(x_0)) = E(Y|X=x_0)\)
can plug into the algebra of an SEM to see the effect of intervention
alternatively, can factorize the graph, set \(x=x_0\) and then marginalize over all variables not in the quantity we want to estimate
this is what people commonly call “adjusting for confounders”
this is the same as the G-computation formula (Robins, 1987), which was derived from a more complext set of assumptions
rules of do-calculus allow us to identify causal effects in general (e.g. in front-door adjustement)
general criterion
back-door / front-door
unconfounded children criterion: if it is possible to block all backdoor paths from \(T\) to all of its children that are ancestors of \(Y\) with a single conditioning set \(S\), then \(P(Y=y|do(T=t))\) is identifiable (tian & pearl, 2002)
examples
ex. correlate flips
in this ex, \(W\) and \(H\) are usually correlated, so conditional distrs. are similar, but do operator of changing \(W\) has no effect on \(H\) (and vice versa)
notation: \(P(H|do(W:=1))\) or \(P_{M[W:=1]}(h)\)
ATE of \(W\) on \(H\) would be \(P(H|do(W:=1)) - P(H|do(W:=0))\)
ex. simple structure
where \(\begin{align}z &= f_Z(u_Z)\\x&=f_X(z, u_X)\\y&=f_Y(x, u_Y) \end{align}\)
4.4.3. randomized experiments#
Randomized experiments randomly assign a treatment, thus creating comparable treatment and control groups on average (i.e. controlling for any confounders).
<IP_ADDRESS>. design#
<IP_ADDRESS>.1. stratification / matched-pairs design#
sometimes we want different strata, ex. on feature \(X_i \in \{1, ..., K \}\)
fully random experiment will not put same amount of points in each stratum + will have different treatment/control balance in each stratum
stratification at design stage: stratify and run RCT for each stratum
can do all the same fisher tests, usually by computing statistics within each stratum than aggregating
sometimes bridge strata with global data
ex. aligned rank statistic - normalize each \(Y_i\) with stratum mean, then look at ranks across all data (hodges & lehmann 1962)
can do neyman-rubin analysis as well - CLT holds with a few large strata and many small strata
can prove that variance for stratified estimator is smaller when stratification is predictive of outcome
matched-pairs design - like stratification, but with only one point in each stratum (i.e. a pair)
in each pair, one unit is given treatment and the other is not
Fisherian inference
\(H_{0F}: Y_{i, j}^{T=1}=Y_{i, j}^{T=0} \; \underbrace{\forall i}_{\text{all pairs}} \underbrace{\forall j}_{\text{both units in pair}}\)
\(\hat \tau_i = \underbrace{(2T_i - 1)}_{-1\text{ or } 1}(Y_{i1} - Y_{i2})\), where \(T_i\) determines which of the two units in the pair was given treatment
many other statistics…e.g. wilcoxon sign-rank statistic, sign statistic, mcnemar’s statistic
Neymanian inference
\(\hat \tau = \frac 1 n \sum_i \tau_i\)
\(\hat V = \frac 1 {n(n-1)} \sum_i (\hat \tau_i - \hat \tau)^2\)
can’t estimate variance as in stratified randomized experiment
heuristically, matched-pairs design helps when matching is well-done and covariates are predictive of outcome (can’t check this at design stage though)
can also perform covariate adjustment (on covariates that weren’t used for matching, or in case matching was inexact)
<IP_ADDRESS>.2. rerandomization balances covariates#
rerandomization adjusts for covariate imbalance given covariate vector \(\mathbf x\) (assume mean 0) at design stage
covariate difference-in-means: \(\mathbf{\hat \tau_x} = \frac 1 {n_1} \sum_i T_i \mathbf x_i - \frac 1 {n_0} \sum_i (1 - T_i)\mathbf x_i\)
this is for RCT
asymptotically zero, but real value need not be
\(\textbf{cov}(\hat\tau_x) = \frac 1 {n_1} S_x^2 + \frac 1 {n_0}S_x^2 = \frac{n}{n_1 n_0}S_x^2\)
\(M = \hat \tau_x^T \textbf{cov}(\hat \tau_x)^{-1} \hat \tau_x\) - Mahalanabois distance measures difference between treatment/control groups
invariant to non-degenerate linear transformations of \(\mathbf x\)
can use other covariate balance criteria
rerandomization: discard treatment allocations when \(M \leq m_{thresh}\)
\(m_{thresh}=\infty\): RCT
\(m_{thresh}=0\): few possible treatment allocations - limits randomness; in practice try to choose very small \(m_{thresh}\)
proposed by Cox (1982) + Morgan & Rubin (2012)
can derive asymptotic distr. for \(\hat \tau\) (li, deng & rubin 2018)
combining rerandomization + regression adjustment can achieve better results (li & ding, 2020)
<IP_ADDRESS>. post-hoc analysis#
<IP_ADDRESS>.1. statification / matching#
post-stratification at analysis stage: condition on stratum
can do conditional FRT or post-stratified Neymanian analysis
can often improve efficiency
is limited, because eventually there are no points in certain strata
this is also called aggregating estimators (e.g. aggregating difference-in-means estimators)
for continuous confounder, can also stratify on propensity score
<IP_ADDRESS>.2. regression adjustment balances covariates#
regression adjustment at analysis stage account for covariates x
fisher random trial adjustment - 2 strategies
construct test-statistic based on residuals of statistical models
regress \(Y_i\) on \(\mathbf x_i\) to obtain residual \(e_i\) - then treat \(e_i\) as pseudo outcome to construct test statistics
use regression coefficient as a test statistic
regress \(Y_i\) on \((T_i, \mathbf x_i\)) to obtain coefficient of \(T_i\) as the test statistic (Fisher’s ANCOVA estimator): \(\hat \tau_F\)
Freedman (2008) found that this estimator had issues: biased, large variance, etc.
Lin (2013) finds favorable properties of the \(\hat \tau_F\) estimator
can get minor improvements by instead using coefficient of \(T_i\) in the OLS of \(Y_i\) on \((T_i, \mathbf x_i, T_i \times \mathbf x_i\))
4.4.4. quasi-experiments#
Can also be called pseudo-experiments. These don’t explicitly randomize treatment, as in RCTs, but some property of the data allows us to control for confounders.
<IP_ADDRESS>. natural experiments#
hard to justify
e.g. jon snow on cholera - something acts as if it were randomized
<IP_ADDRESS>. back-door criterion: capture parents of T#
back-door criterion - establishes if variables \(T\) and \(Y\) are confounded in a graph given set \(S\)
sufficient set \(S\) = admissible set - set of factors to calculate causal effect of \(T\) on \(Y\) requires 2 conditions - no element of \(S\) is a descendant of \(T\) - \(S\) blocks all paths from \(T\) to \(Y\) that end with an arrow pointing to \(T\) (i.e. back-door paths)
intuitively, paths which point to \(T\) are confounders
if \(S\) is sufficient set, in each stratum of \(S\), risk difference is equal to causal effect
e.g. risk difference \(P(Y=1|T=1, S=s) - P(Y=1|T=0, S=s)\)
e.g. causal effect \(P(Y=1|do(T=1), S=s) - P(Y=1|do(T=0), S=s)\)
average outcome under treatment, \(P(Y=y|do(T=t)) = \sum_s P(Y=y|T=t, S=s) P(S=s) \)
sometimes called back-door adjustment - really just covariate adjustment (same as we had in potential outcomes)
there can be many sufficient sets, so we may choose the set which minimizes measurement cost or sampling variability
propensity score methods help us better estimate the RHS of this average outcome, but can’t overcome the necessity of the back-door criterion
<IP_ADDRESS>. front-door criterion: good mediator variable#
front-door criterion - establishes if variables \(T\) and \(Y\) are confounded in a graph given mediators \(M\)
intuition: we have unknown confounder \(U\), but can find a mediator \(M\) between \(T\) and \(Y\) unaffected by \(U\), we can still calculate the effect
this is because we can calculate effect of \(T\) on \(M\), \(M\) on \(Y\), then multiply them
\(M\) must satisfy 3 conditions
\(M\) intercepts all directed paths from \(T\) to \(Y\) (i.e. front-door paths)
there is no unblocked back-door path from \(T\) to \(M\)
all back-door paths from \(M\) to \(Y\) are blocked by \(T\)
when satisfied and \(P(t, m) > 0\), then causal effect is identifiable as \(P(y|do(T=t)) = \sum_m P(m|t) \sum_{t'} P(y|t', m) P(t')\)
smoking ex. (hard to come up with many)
\(T\) = whether one smokes
\(Y\) = lung cancer
\(M\) = accumulation of tar in lungs
\(U\) = condition of one’s environment
only really need to know about treatment, M, and outcome
graph LR
U -->Y
U --> T
T --> M
M --> Y
<IP_ADDRESS>. regression discontinuity: running variable#
dates back to thistlethwaite & campbell, 1960
treatment definition (e.g. high-school acceptance) has an arbitrary threshold (e.g. score on a test)
comparing groups very close to the cutoff should basically control for confounding
easily satisfies unconfounding, but has no overlap at all (\(P(T_i=1|Z_i=z)\) is always 0 or 1)
\(\tau_{c}=\mathbb{E}\left[Y_{i}(1)-Y_{i}(0) \mid Z_{i}=c\right]\) is identified via \(\tau_{c}=\lim _{z \downarrow c} \mathbb{E}\left[Y_{i} \mid Z_{i}=z\right]-\lim _{z \uparrow c} \mathbb{E}\left[Y_{i} \mid Z_{i}=z\right]\) under continuity assumptions
can estimate via local linear regr. – kernel fits things on either side
needs assumptions on the smoothness of the mean function
alternatively, assume some unconfounded noise in the running variable (i.e. the variable being thresholded)
results in deconvolution-type estimators (see eckles et al. 2020)
<IP_ADDRESS>. difference-in-difference#
difference-in-difference is a name given to many methods for estimating effects in longitudinal data = panel data
requires data from both groups at 2 or more time periods (at least one before treatment and one after)
simple constant-treatment model: \(Y_{i t}=Y_{i t}(0)+T_{i t} \tau,\) for all \(i=1, \ldots, n, t=1, \ldots\)
assumes no effect heterogeneity
assumes treatment at time only effects outcomes at time t - this can be weird
one approach for estimation: assume two-way model: \(Y_{i t}=\alpha_{i}+\beta_{t}+T_{i t} \tau+\varepsilon_{i t}, \quad \mathbb{E}[\varepsilon \mid \alpha, \beta, T]=0\)
estimator for difference-in-difference with two timepoints
\(\hat{\tau}=\frac{1}{\left|\left\{i: T_{i 2}=1\right\}\right|} \underbrace{\sum_{\left\{i: T_{i 2}=1\right\}}\left(Y_{i 2}-Y_{i 1}\right)}_{\text{diff for treated group}}-\frac{1}{\left|\left\{i: T_{i 2}=0\right\}\right|} \underbrace{\sum_{\left\{i: T_{i 2}=0\right\}}\left(Y_{i 2}-Y_{i 1}\right)}_{\text{diff for untreated group}}\)
second approach for estimation of constant-treatment: interactive panel models \(Y_{i t}=A_{i .} B_{t .}^{\prime}+T_{i t} \tau+\varepsilon_{i t}, \quad \mathbb{E}[\varepsilon \mid A, B, T]=0, \quad A \in \mathbb{R}^{n \times k}, B \in \mathbb{R}^{T \times k}\)
allows for rank \(k\) matrix, less restrictive (no longer forces parallel trends for all units)
can estimate with synthetic controls (abadie, diamon, & hainmueller, 2010)
artificially re-weight unexposed units (i.e. units with \(T_i=0\)) so their average trend matches the unweighted mean trend up to time \(t_0\)
if the weights create thes parallel trends, they should alos balance the latent factors \(A_i\)
-
trends are clearly not parallel, but after reweighting they become parallel
many other estimators, e.g. via clustering or nuclear norm minimization
third approach: design-based assumptions e.g. \(Y_{i .}(0) \perp T_{i .} \mid S_{i}, \quad S_{i}=\sum_{t=1}^{T} T_{i t}\)
ex. \(Y_{it}\) is health outcome, \(T_{it}\) is medical treatment, \(S_i\) is unobserved health-seeking behavior
\(\hat{\tau}=\sum_{i, t} \gamma_{i t} Y_{i t}\) where \(\gamma\)-matrix depends only on treatment assignment
<IP_ADDRESS>. instrumental variable#
graph LR I --> T X --> T T --> Y
instrument \(I\)- measurable quantity that correlates with the treatment, and is \(\underbrace{\color{NavyBlue}{\text{only related to the outcome via the treatment}}}_{\textbf{exclusion restriction}}\)
precisely 3 conditions must hold for \(I_i\):
exogenous: \(\varepsilon_{i} \perp I_{i}\)
relevant: \(\operatorname{Cov}\left[T_{i}, I_{i}\right] \neq 0 \)
exclusion restriction: any effect of \(I_{i}\) on \(Y_{i}\) must be mediated via \(T_{i}\)
uncheckable
intuitively, need to combine effect of instrument on treatment and effect of instrument on outcome (through treatment)
in practice, often implemented in a 2-stage least squares (regress \(I \to T\) then \(T\to Y\))
\(Y_{i}=\alpha+T_{i} \tau+\varepsilon_{i}, \quad \varepsilon_{i} \perp I_{i}\)
\(T_{i}=I_{i} \gamma+\eta_{i}\)
most important point is that \(\epsilon_i \perp I_i\)
Wald estimator = \(\frac{Cov(Y, I)}{Cov(T, I)}\)
LATE = local average treatment effect - this estimate is only valid for the patients who were influenced by the instrument
we may have many potential instruments
in this case, can learn a funciton of the instruments via cross-fitting as an instrument
examples
\(I\): stormy weather, \(T\) price of fish, \(Y\) demand for fish
stormy weather makes it harder to fish, raising price but not affecting demand
\(I\): quarter of birth, \(T\): schooling in years, \(Y\): earnings (angrist & krueger, 1991)
\(I\): sibling sex composition, \(T\): family size, \(Y\): mother’s employment (angist & evans, 1998)
\(I\): lottery number, \(T\): veteran status, \(Y\): mortality
\(I\): geographic variation in college proximity, \(T\): schooling, \(Y\): wage (card, 1993)
<IP_ADDRESS>.1. effect under non-compliance#
CACE \(\tau_c\) (complier average causal effect) = LATE (local average treatement effect)
technical setting: noncompliance - sometimes treatment assigned \(I\) and treatment received \(T\) are different
assumptions
randomization = instrumental unconfoundedness: \(I \perp \{T^{I=1}, T^{I=0}, Y^{I=1}, Y^{I=0} \}\)
randomization lets us identify ATE of \(I\) on \(T\) and \(I\) on \(Y\)
\(\tau_{T}=E\{T^{I=1}-T^{I=0}\}=E(T \mid I=1)-E(T \mid I=0)\)
\(\tau_{Y}=E\{Y^{I=1}-Y^{I=0}\}=E(Y \mid I=1)-E(Y \mid I=0)\)
intention-to-treat \(\tau_Y\)
four possible outcomes:
\(C_{i}=\left\{\begin{array}{ll} \mathrm{a}, & \text { if } T_{i}^{I=1}=1 \text { and } T_{i}^{I=0}=1 \text{ always taker}\\ \mathrm{c}, & \text { if } T_{i}^{I=1}=1 \text { and } T_{i}^{I=0}=0\text{ complier} \\ \mathrm{d}, & \text { if } T_{i}^{I=1}=0 \text { and } T_{i}^{I=0}=1 \text{ defier}\\ \mathrm{n}, & \text { if } T_{i}^{I=1}=0 \text { and } T_{i}^{I=0}=0\text{ never taker} \end{array}\right.\)
exclusion restriction: \(Y_i^{I=1} = Y_i^{I=0}\) for always-takers and never-takers
means treatment assignment affects outcome only if it affects the treatment
monotonicity: \(P(C=d) = 0\) or \(T_i^{U=1} \geq T_i^{U=0} \; \forall i\) - there are no defiers
testable implication: \(P(T=1|I=1) \geq P(T=1|C=0)\)
under these 3 assumptions, LATE \(\tau_c = \frac{\tau_Y}{\tau_T} = \frac{E(Y \mid I=1)-E(Y \mid I=0)}{E(T \mid I=1)-E(T \mid I=0)}\)
this can be estimated with the WALD estimator
basically just scales the intention-to-treat estimator, so usually similar conclusions
if we have some confounders \(X\), can adjust for them
the smaller \(\tau_T\) is (i.e. the more noncompliance there is), the worse properties the LATE estimator has
instrumental variable inequalities \(E(Q|I=1) \geq E(Q|I=0)\) where \(Q = TY, T(1-Y), (1-T)Y, T+Y - TY\)
instrumental inequality (Pearl 1995) - a necessary condition for any variable \(I\) to qualify as an instrument relative to the pair \((T, Y)\): \(\max_T \sum_Y \left[ \max_I P(T,Y | I) \right] \leq 1\)
when all vars are binary, this reduces to the following:
\(P(Y=0, T=0 \mid I=0) + P(Y=1, T=0 \mid I=1) \leq 1\) \(P(Y=0, T=1 \mid I=0)+P(Y=1, T=1 \mid I=1) \leq 1\) \(P(Y=1, T=0 \mid I=0)+P(Y=0, T=0 \mid I=1) \leq 1\) \(P(Y=1, T=1 \mid I=0)+P(Y=0, T=1 \mid I=1) \leq 1\)
instrumental variable criterion - sufficient condition for identifying the causal effect \(P(y|do(t))\) is that every path between \(T\) and any of its children traces at least one arrow emanating from a measured variable
sometimes this is satisfied even when back-door criterion is not
<IP_ADDRESS>. proximal algorithms#
<IP_ADDRESS>. synthetic data experiments#
Towards causal benchmarking of bias in face analysis algorithms (balakrishnan et al. 2020) - use GANs to generate synthetic data where only attribute varies
causal imputation / causal transport = mapping bbetween different domains, where only one domain at a time is ever observed
Multi-Domain Translation by Learning Uncoupled Autoencoders (yang & uhler 2019)
learn autoencoders for different domains that all map to a shared latent space
this allows to translate between different domains, by using one encoder and then a different decoder
Causal Imputation via Synthetic Interventions (squires, …, uhler 2020)
Matched sample selection with GANs for mitigating attribute confounding (singh et al. 2021)
4.4.5. observational analysis#
The emphasis in this section is on ATE estimation, as an example of the considerations required for making causal conclusions. Observational analysis focuses on adjusting for observed confounding.
<IP_ADDRESS>. ATE estimation basics#
assume we are given iid samples of \(\{ X_i, T_i, Y_i^{T=1}, Y_i^{T=0} \}\), and drop the index \(i\)
\(\tau = E\{Y^{T=1} - Y^{T=0}\}\): average treatment effect (ATE) - goal is to estimate this
\(\tau_T =E\{Y^{T=1}−Y^{T=0}|T =1\}\): ATE on the treated units
\(\tau_C =E\{Y^{T=1}−Y^{T=0}|T =0\}\): ATE on the control units
\(\tau_{PF} = E[Y|T=1] - E[Y|T=0]\): prima facie causal effect
\(= E[Y^{T=1}|T=1] - E[Y^{T=0}|T=0]\)
naive, but computable!
generally biased, with selection biases:
\(E[Y^{T=0}|T=\textcolor{NavyBlue}1] - E[Y^{T=0}|T=\textcolor{NavyBlue}0]\)
\(E[Y^{T=1}|T=\textcolor{NavyBlue}1] - E[Y^{T=1}|T=\textcolor{NavyBlue}0]\)
randomization tells us the treatment is independent of the outcome with/without treatment \(T \perp \{Y^{T=1}, Y^{T=0}\}\), so the selection biases are zero (rubin, 1978)
\(\implies \tau = \tau_T = \tau_C\)
this is more important than balancing the distr. of covariates
conditioning on observed X, selection bias terms are zero:
\(E\{Y^{T=0}|T=1, X\} = E\{Y^{T=0}|T=0, X\}\)
\(E\{Y^{T=1}|T=1, X\} = E\{Y^{T=1}|T=0, X\}\)
\(\implies \tau(X) = \tau_T(X) = \tau_C(X) = \tau_{PF}(X)\)
ex. stratified ATE estimator (given discrete covariate)
<IP_ADDRESS>. regression adjustments#
ATE conditional outcome modeling (all assume ignorability)
ex. \(\tau = \beta_t\) in OLS
\(E(Y|T, X) = \beta_0 + \beta_t T + \beta_x^TX\)
assumes treatment effect is same for all individuals
ex. \(\tau = \beta_t + \beta_{tx}^TE(X)\)
\(E(Y|T, X) = \beta_0 + \beta_tT + \beta_x^TX + \beta^T_{tx} X T\)
incorporates heterogeneity
intuition
much like imputing missing potential outcomes using a linear model
using nearest-neighbor regr. would correspond to a matching-without-replacement estimator
sometimes use propensity scores as a predictor as well
assuming linear form is relatively strong assumption compared to that made by weighting / stratification
regr. adjustments are the most popular form of adjustments
these easily generalize to when \(T\) is continuous
\(\hat \tau = \frac 1 n \sum_i (\hat \mu_1(X_i) - \hat \mu_0(X_i))\)
general mean functions \(\hat \mu_1(x), \hat \mu_0(x)\) approximate \(\mu_i =E\{ Y^{T=i} |X\}\)
consistent when \(\mu_i\) functions are well-specified
over-adjustment
M-bias
originally, \(T \perp Y\) 😊
after adjusting for X, \(T \not \perp Y\) 🙁
graph LR U1 --> T U1 --> X U2 --> X U2 --> Y
Z-bias: after adjusting, bias is larger
graph LR X --> T T --> Y U --> Y U --> T
<IP_ADDRESS>. weighting methods#
Weighting methods assign a different importance weight to each unit to match the covariates distributions across treatment groups after reweighting. Balance is often used as a goodness of fit check after weighting (imbens & rubin 2015).
<IP_ADDRESS>.1. inverse propensity weighting#
propensity score \(e(X, Y^{T=1}, Y^{T=0}) = P\{T=1|X, Y^{T=1}, Y^{T=0}\}\)
under strong ignorability, \(e(X)=P(T=1|X)\)
Thm. if \(\underbrace{T \perp \{ Y^{T=1}, Y^{T=0}\} | \color{NavyBlue} X}_{\text{strong ignorability on X}}\), then \(\underbrace{T \perp \{ Y^{T=1}, Y^{T=0}\} | \textcolor{NavyBlue}{e(X)}}_{\text{strong ignorability on e(X)}}\)
therefore, can stratify on \(e(X)\), but still need to estimate \(e(X)\), maybe bin it into K quantiles (and pick K)
could combine this propensity score weighting with regression adjustment (e.g. within each stratum)
assumes positivity
intuition: \(e(X)\) fully mediates path from \(X\) to \(T\)
Thm. \(T \perp X \; | \; e(X)\). Moreover, for any function \(h\), \(E\{\frac{T \cdot h(X)}{e(X)}\} = E\{\frac{(1-T)h(X)}{1-e(X)}\}\)
can use this result to check for covariate balance in design stage
can view \(h(X)\) as psuedo outcome and estimtate ATE
if we specify it to something like \(h(X)=X\), then it should be close to 0
\(\hat \tau_{ht} = \frac 1 n \sum_i \frac{T_iY_i}{\hat e(X_i)} - \frac 1 n \sum_i \frac{(1-T_i)Y_i}{1-\hat e(X_i)} \) = inverse propensity score weighting estimator = horvitz-thompson estimator (horvitz & thompson, 1952)
weight outcomes by \(1/e(X)\) for treated individuals and \(1/(1-e(X))\) for untreated
Based on Thm. if \(\underbrace{T \perp \{ Y^{T=1}, Y^{T=0}\} | X}_{\text{strong ignorability on X}}\), then:
\(E\{Y^{T=1}\} = E \left \{ \frac{TY}{e(X)} \right \}\)
\(E\{Y^{T=0}\} = E\left \{ \frac{(1-T)Y}{1-e(X)} \right \}\)
\(\implies \tau = E \left \{ \frac{TY}{e(X)} - \frac{(1-T)Y}{1-e(X)} \right \}\)
consistent when propensity scores are correctly specified
intuition: assume we have 2 subgroups in our data
if prob. of a sample being assigned treatment in one subgroup is low, should upweight it because this sample is rare + likely gives us more information
this also helps balance the distribution of the treatment for each subgroup
if we add a constant to \(Y\), then this estimator changes (not good) - if we adjust to avoid this change, we get the Hajek estimator (hajek, 1971), which is often more stable
scores near 0/1 are unstable - sometimes truncate (“trim”) or drop units with these scores
fundamental problem is ovelap of covariate distrs. in treatment/control
when score = 0 or 1, counterfactuals may not even be well defined
stratified estimator can be seen as a particular case of IPW estimator
<IP_ADDRESS>.2. doubly robust estimator#
combines weighting and regr. adjustment
\(\hat \tau^{\text{dr}} = \hat \mu_1^{dr} - \hat \mu_0^{dr}\) = doubly robust estimator = augmented inverse propensity score weighting estimator (robins, rotnizky, & zhao 1994, scharfstein et al. 1999, bang & robins 2005)
given \(\mu_1(X, \beta_1)\), \(\mu_0(X, \beta_0)\), e.g. linear
given \(e(X, \alpha)\), e.g. logistic
\(\tilde{\mu}_{1}^{\mathrm{dr}} =E\left[ \overbrace{\mu_{1}\left(X, \beta_{1}\right)}^{\text{outcome mean}} + \overbrace{\frac{T\left\{Y-\mu_{1}\left(X, \beta_{1}\right)\right\}}{e(X, \alpha)}}^{\text{inv-prop residuals}}\right]\)
\(\tilde{\mu}_{0}^{\mathrm{dr}} =E\left[\mu_{0}\left(X, \beta_{0}\right) + \frac{(1-T)\left\{Y-\mu_{0}\left(X, \beta_{0}\right)\right\}}{1-e(X, \alpha)}\right]\)
augments the oucome regression mean with inverse-propensity of residuals
can alternatively augment inv propensity score weighting estimator by the outcome models:
\(\begin{aligned} \tilde{\mu}_{1}^{\mathrm{dr}} &=E\left[\frac{T Y}{e(X, \alpha)}-\frac{T-e(X, \alpha)}{e(X, \alpha)} \mu_{1}\left(X, \beta_{1}\right)\right] \\ \tilde{\mu}_{0}^{\mathrm{dr}} &=E\left[\frac{(1-T) Y}{1-e(X, \alpha)}-\frac{e(X, \alpha)-T}{1-e(X, \alpha)} \mu_{0}\left(X, \beta_{0}\right)\right] \end{aligned}\)
consistent if either the propensity scores or mean functions are well-specified:
propensities well-specified: \(e(X, \alpha) = e(X)\)
mean functions well-specified: \(\left\{\mu_{1}\left(X, \beta_{1}\right)=\mu_{1}(X), \mu_{0}\left(X, \beta_{0}\right)=\mu_{0}(X)\right\}\)
in practice, often use cross-fitting (split the data randomly into two halves \(\mathcal I_1\) and \(\mathcal I _2\))
\(\hat{\tau}_{A I P W}=\frac{\left|\mathcal{I}_{1}\right|}{n} \hat{\tau}^{\mathcal{I}_{1}}+\frac{\left|\mathcal{I}_{2}\right|}{n} \hat{\tau}^{\mathcal{I}_{2}}\)
\(\hat{\tau}^{\mathcal{I}_{1}}=\frac{1}{\left|\mathcal{I}_{1}\right|} \sum_{i \in \mathcal{I}_{1}}\left(\hat{\mu}_{(1)}^{\mathcal{I}_{2}}\left(X_{i}\right)-\hat{\mu}_{(0)}^{\mathcal{I}_{2}}\left(X_{i}\right)\right. \left.+W_{i} \frac{Y_{i}-\hat{\mu}_{(1)}^{\mathcal{I}_{2}}\left(X_{i}\right)}{\hat{e}^{\mathcal{I}_{2}}\left(X_{i}\right)}-\left(1-W_{i}\right) \frac{Y_{i}-\hat{\mu}_{(0)}^{\mathcal{I}_{2}}\left(X_{i}\right)}{1-\hat{e}^{\mathcal{I}_{2}}\left(X_{i}\right)}\right)\)
avoids bias due to overfitting
allows us to ignore form of estimators \(\hat \mu\) and \(\hat e\) and depend only on overlap, consistency, and risk decay (so CV risk of estimators should be small)
targeted maximum likelihood (van der laan & rubin, 2006) - more general than DRE
<IP_ADDRESS>.3. alternative weighting#
solutions to deal with extreme weights (from assaad et al. 2020):
Matching Weights (Li & Greene, 2013): MW
Truncated IPW (Crump et al., 2009): TruncIPW
Overlap Weights (Li et al., 2018): OW - this uses (1 - IPW weights), and doesn’t suffer from instability at extreme values
when estimating propensity scores with neural nets, often overconfident
in general, there is a more general class of weights that can be used to balance covariates (li, morgan, & zaslavsky, 2016)
directly incorporating covariate imbalance in weight construction (Graham et al., 2012; Diamond & Sekhon, 2013)
unifying perspective on these methods via covariate-balancing loss functions (zhao, 2019)
in general, balancing need not directly balance the propensity scores
instead, might find propensity weights which balance covariates along certain basis functions \(\psi_j(x)\)
\(\frac{1}{n} \sum_{i=1}^{n} \frac{W_{i} \psi_{j}\left(X_{i}\right)}{\hat{e}\left(X_{i}\right)} \approx \frac{1}{n} \sum_{i=1}^{n} \psi_{j}\left(X_{i}\right),\) for all \(j=1,2, \ldots\)
this can be desirable in high dims, when propensity scores may be unstable
hard moment-matching conditions (Li & Fu, 2017; entropy balancing from Hainmueller, 2012; Imai & Ratkovic, 2014)
soft moment-matching conditions (Zubizarreta, 2015)
approximate residual balancing (athey, imbens, & wager, 2018) - combines balancing weights with a regularized regression adjustment for learning ATE from high-dimensional data
Learning Causal Effects via Weighted Empirical Risk Minimization (jung et al. 2020) - estimate any computation (which usually requires actually modeling individual conditional probabilities) using weighted empirical risk minimization
<IP_ADDRESS>. stratification / matching#
Matching methods choose try to to equate (or “balance’’) the distribution of covariates in the treated and control groups by picking well-matched samples of the original treated and control groups
Matching methods for causal inference: A review and a look forward (stuart 2010)
matching basics
includes 1:1 matching, weighting, or subclassification
linear regression adjustment (so not matching) can actually increase bias in the estimated treatment effect when the true relationship between the covariate and outcome is even moderately non-linear, especially when there are large differences in the means and variances of the covariates in the treated and control groups
matching distance measures
propensity scores summarize all of the covariates into one scalar: the probability of being treated
defined as the probability of being treated given the observed covariates
propensity scores are balancing scores: At each value of the propensity score, the distribution of the covariates X defining the propensity score is the same in the treated and control groups – usually this is logistic regresion
if treatment assignment is ignorable given the covariates, then treatment assignment is also ignorable given the propensity score:
hard constraints are called “exact matching” - can be combined with other methods
mahalanabois distance
matching methods
stratification = cross-tabulation - only compare samples when confounding variables have same value
nearest-neighbor matching - we discard many samples this way (but samples are more similar, so still helpful)
optimal matching - consider all potential matches at once, rather than one at a time
ratio matching - could match many to one (especially for a rare group), although picking the number of matches can be tricky
with/without replacement - with seems to have less bias, but more practical issues
subclassification/weighting: use all the data - this is nice because we have more samples, but we also get some really poor matches
subclassification - stratify score, like propensity score, into groups and measure effects among the groups
full matching - automatically picks the number of groups
weighting - use propensity score as weight in calculating ATE (also know as inverse probability of treatment weighting)
common support - want to look at points which are similar, and need to be careful with how we treat points that violate similarity
genetic matching - find the set of matches which minimize the discrepancy between the distribution of potential confounders
diagnosing matches - are covariates balanced after matching?
ideally we would look at all multi-dimensional histograms, but since we have few points we end up looking at 1-d summaries
one standard metric is difference in means of each covariate, divided by its stddev in the whole dataset
analysis of the outcome - can still use regression adjustment after doing the matching to clean up residual covariances
unclear how to propagate variance from matching to outcome analysis
matching does not scale well to higher dimensions (abadie & imbens, 2005), improving balance for some covariates at the expense of others
bias-corrected matching estimator averages over all matches
if we get perfect matches on covariates \(X\) (or propensity score), it is just like doing matched design
in practice, we only get approximate matches
for a unit, we take its value and impute its counterfactual as \(\frac 1 {|matches|} \sum_{\text{match} \in {\text{matches}}} Y_{\text{match}}\)
Abadie and Imbens (2011) add bias correction term
requires complex bootstrap procedure to obtain variance
bias-corrected matching estimator is very similar to doubly robust estimator
\(\begin{aligned} \hat{\tau}^{\mathrm{mbc}} &=n^{-1} \sum_{i=1}^{n}\left\{\hat{\mu}_{1}\left(X_{i}\right)-\hat{\mu}_{0}\left(X_{i}\right)\right\}+n^{-1} \sum_{i=1}^{n}\left\{\left(1+\frac{K_{i}}{M}\right) T_{i} \hat{R}_{i}-\left(1+\frac{K_{i}}{M}\right)\left(1-T_{i}\right) \hat{R}_{i}\right\} \\ \hat{\tau}^{\mathrm{dr}} &=n^{-1} \sum_{i=1}^{n}\left\{\hat{\mu}_{1}\left(X_{i}\right)-\hat{\mu}_{0}\left(X_{i}\right)\right\}+n^{-1} \sum_{i=1}^{n}\left\{\frac{T_{i} \hat{R}_{i}}{\hat{e}\left(X_{i}\right)}-\frac{\left(1-T_{i}\right) \hat{R}_{i}}{1-\hat{e}\left(X_{i}\right)}\right\} \end{aligned}\)
<IP_ADDRESS>. misc methods#
double machine learning
first
fit a model to predict \(Y\) from \(X\) to get \(\hat Y\)
fit a model to predict \(T\) from \(X\) to get \(\hat T\)
next, predict \(Y- \hat Y\) from \(T - \hat T\), which has no in some sense removed effects of \(X\)
ex. Chernozhukov et al. (2018), ‘Double/debiased machine learning for treatment and structural parameters’
ex. Felton (2018), Chernozhukov et al. on Double / Debiased Machine Learning
ex. Syrgkanis (2019), Orthogonal/Double Machine Learning
ex. Foster and Syrgkanis (2019), Orthogonal Statistical Learning
4.4.6. assumptions#
<IP_ADDRESS>. common assumptions#
unconfoundedness
exchangeability \(T \perp \!\!\! \perp \{ Y^{t=1}, Y^{t=0}\}\) = exogeneity = randomization: the value of the counterfactuals doesn’t change based on the choice of the treatment
intuition: we could have exchanged the treatment groups and done this experiment
there are weaker forms of this assumption, such as mean exchangeability (where only means are exchangeable)
ignorability \(T \perp \!\!\! \perp \{ Y^{T=1}, Y^{T=0}\} | X \) = unconfoundedness = selection on observables = conditional exchangeability
very hard to check!
rubin 1978; rosenbaum & rubin 1983
this is strong ignorability, weak ignorability is a little weaker
this will make selection biases zero
\(E[Y^{T=0}|T=\textcolor{NavyBlue}1] - E[Y^{T=0}|T=\textcolor{NavyBlue}0]\)
\(E[Y^{T=1}|T=\textcolor{NavyBlue}1] - E[Y^{T=1}|T=\textcolor{NavyBlue}0]\)
graph assumptions
back-door criterion, front-door criterion, unconfounded children criterion
basics in a graph
modularity assumptions
markov assumptions
exclusion restrictions: For every variable \(Y\) having parents \(PA(Y)\) and for every set of endogenous variables \(S\) disjoint of \(PA(Y)\), we have \(Y^{PA(y)} = Y^{PA(Y), S}\)
fixing a variables parents fully determines it
independence restrictions: variables are independent of noise variables given their markov blanket
overlap / imbalance assumption
positivity \(P(T=1|x) > 0 \: \forall x\) = overlap = common support - probability of receiving any treatment is positive for every individual
without overlap, assumption of linear effect can be very strong (e.g. extrapolates out of sample)
strong overlap assumption: propensity scores are bounded away from 0 and 1
\(0 < \alpha_L \leq e(X) \leq \alpha_U < 1\)
when \(e(X)=\)0 or 1, potential outcomes are not even well-defined (king & zeng, 2006)
things can be matched
overlap and unconfoundedness trade off (e.g. see amour et al. 2020)
strong overlap also implies moment bounds for covariate balance
treatment assumptions
treatment is not ambiguous
no interference: my outcome is unaffected by anyone else’s treatment
\(Y_i(t_1, ...,t_n) = Y_i(t_i)\)
consistency: \(Y=Y^{t=0}(1-T) + Y^{t=1}T\) - outcome agrees with the potential outcome corresponding to the treatment indicator
this grounds the definition of the counterfactuals \(Y^{t=0}, Y^{t=1}\)
alternatively, \(T=t \implies Y=Y(t)\)
basically means treatment is well-defined
stable unit treatment value assumption (SUTVA) = no-interference assumption (Rubin, 1980): \(Y_i = Y_i(T_i)\)
means unit \(i\)’s outcome is a function of unit \(i\)’s treatment
no interference
consistency (+deterministic potential outcomes)
is it something that could be intervened on?
can we intervene on something like Race? Soln: intervene on perceived race
can we intervene on BMI? many potential interventions: e.g. diet, exercise
SCM counterfactuals further assume 2 things:
\(Y_{yz} = y \quad \forall y, \text{ subsets }Z\text{, and values } z \text{ for } Z\)
ensures interventions \(do(Y=y)\) results in \(Y=y\), regardless of concurrent interventions, say \(do(Z=z)\)
\(X_z = x \implies Y_{xz} = Y_z \quad \forall x, \text{ subsets }Z\text{, and values } z \text{ for } Z\)
generalizes above
ensures interventions \(do(X=x)\) results in appropriate counterfactual, regardless of holding a variable fixed, say \(Z=z\)
assumptions for ATE being identifiable: exchangeability (or ignorability) + consistency, positivity
Independent Causal Mechanisms (ICM) Principle: The causal generative process of a system’s variables is composed of autonomous modules that do not inform or influence each other.
In the probabilistic case, this means that the conditional distribution of each variable given its causes (i.e., its mechanism) does not inform or influence the other mechanisms.
<IP_ADDRESS>. assumption checking#
<IP_ADDRESS>.1. check ignorability: use auxilary outcome#
negative outcome - assume we have a secondary informative outcome \(Y'\)
\(Y'\) is similar to \(Y\) in terms of confounding: if we believe \(T \perp Y(t) \mid X\) we also think \(T \perp Y'(t) \mid X\)
we know the expected effect of \(T\) on \(Y'\) (ex. it should be 0)
\(\tau(T \to Y') = E\{Y'^{T=1} - Y'^{T=0})\}\)
ex. cornfield et al. 1959 - effect of smoking on car accident
graph LR X(X) -->Y'(Y') X --> Y X --> T T --> Y
negative exposure - assume we have a secondary informative treatment \(T'\)
\(T'\) is similar to \(T\) in terms of confounding: if we believe \(T \perp Y(t) \mid X\) we also think \(T' \perp Y(t) \mid X\)
we know the expected effect of \(T'\) on \(Y\) (ex. it should be 0)
\(\tau(T' \to Y) = E\{Y^{T'=1} - Y^{T'=0}\}\)
ex. maternal exposure \(T\) and parental exposure \(T'\)
graph LR X -->T' X --> Y X --> T T --> Y
<IP_ADDRESS>.2. check ignorability impact: sensitivity analysis wrt unmeasured confounding#
sensitivity analysis measures how “sensitive” a model is to changes in the value of the parameters / structure / assumptions of the model
we focus on sensitivity analyses wrt unmeasured confounding - how strong the effects of an unobserved covariate \(U\) on the exposure and/or the outcome would have to be to change the study inference (estimated effect of \(T\) on \(Y\))
there are many types of such analyses (for a review, see liu et al. 2013)
ex. rosenbaum-type: interested in finding thresholds of the following association(s) that would render test statistic of the study inference insignificant
e.g. true odds-ratio of outcome and treatment, adjusted for \(X\) and \(U\)
unobserved confounder and the treatment (odds-ratio \(OR_{\text{UT}}\))
and/or unobserved confounder and the outcome (odds-ratio \(OR_{\text{UY}}\))
usually used after matching
3 types
primal sensitivity analysis: vary \(OR_{\text{UT}}\) with \(OR_{\text{UY}} = \infty\)
dual sensitivity analysis: vary \(OR_{\text{UY}}\) with \(OR_{\text{UT}}=\infty\)
simultaneous sensitivity analysis: vary both vary \(OR_{\text{UT}}\) and \(OR_{\text{UY}}\)
ex. confidence-interval methods: quantify unobserved confounder under specifications then arrive at target of interest + confidence interval, adjusted for \(U\)
first approach: use association between \(T, Y, U\) to create data as if \(U\) was observed
specifications: \(P(U|T=0\)), \(P(U|T=1)\) (greenland, 1996)
specifications: \(OR_{\text{UY}}\) and \(OR_{\text{UT}}\), \(U\) evenly distributed (harding, 2003)
given either of these specifications, can fill out the table of \(X, Y|U\), then use these weights to re-create data and fit weighted logistic regression
second approach: use association between \(T, Y, U\) to compute adjustment
this approach can relax some assumptions, such as the no-three-way-interaction assumption
specifications: \(P(U|T=1), P(U|T=0), OR_{\text{UY|T=1}}, OR_{\text{UY|T=0}}\)(lin et al. 1998)
specifications: \(P(U|T=1), P(U|T=0), OR_{\text{UY}}\) (vanderweele & arah, 2011)
ex. cornfield-type (cornfield et al. 1959) - seminal work
ignorability does not hold \(T \not \perp \{ Y^{T=1}, Y^{T=0}\} | X \)
latent ignorability holds \(T \perp \{ Y^{T=1}, Y^{T=0}\} | (X, U) \)
true causal effect (risk ratio): \(\mathrm{RR}_{x}^{\text {true }}=\frac{\operatorname{pr}\{Y^{T=1}=1 \mid X=x\}}{\operatorname{pr}\{Y^{T=0}=1 \mid X=x\}}\)
observed: \(\mathrm{RR}_{x}^{\mathrm{obs}}=\frac{\operatorname{pr}(Y=1 \mid T=1, X=x)}{\operatorname{pr}(Y=1 \mid T=0, X=x)}\)
we can ask how strong functions of U, T, Y all given X must be to explain away an observed association
\(\mathrm{RR}_{T U \mid x}=\frac{\operatorname{pr}(U=1 \mid T=1, X=x)}{\operatorname{pr}(U=1 \mid T=0, X=x)}\)
\(\mathrm{RR}_{U Y \mid x}=\frac{\operatorname{pr}(Y=1 \mid U=1, X=x)}{\operatorname{pr}(Y=1 \mid U=0, X=x)}\)
Thm: under latent ignorability, \(\mathrm{RR}_{x}^{\mathrm{obs}} \leq \frac{\mathrm{R} \mathrm{R}_{T U \mid x} \mathrm{RR}_{U Y \mid x}}{\mathrm{RR}_{T U \mid x}+\mathrm{RR}_{U Y \mid x}-1}\)
ex. bounds on direct effects with confounded intermediate variables (Cai et al. 2008)
bounds with no assumptions (manski 1990)
worst-case bounds are very poor
also bounds with monotone treatment response (manski, 1997)
bounds with optimal treatment selection (i.e. individuals always receive the treatement that is best for them) (manski, 1990, “nonparametric bounds on treatment effects”)
Sensitivity Analysis in Observational Research: Introducing the E-Value (vanderweele & ding, 2017)
E-value = min strength of association (risk ratio) that an unmeasured confounder would require with both \(T\) and \(Y\) to explain away a specific treatment-outcome association, conditional on \(X\)
higher = more causal
Interpretable Sensitivity Analysis for Balancing Weights (soriano et al. 2021) - percentile bootstrap procedure applied to balancing weights estimators


Welcome to Saving Nemo Query Tool
{% if not session.logged_in %}
Enter Query Page as Guest
Log In as Admin
{% else %}
Enter Query Page as Admin
{% endif %}
RoboMussel
Biomimic...since 1999
RoboMussel
Biomimic...since 2004
RoboMussel
Biomimic...since 1999


to see some beautiful mountain pictures clickhere
some beautiful landscapes arehere!!
hd animals pictures are click !!


Artifacts
from the "Garden of Interactive Delights", an
interactive art installation, created in collaboration with Benjamin
Bergery. Included "Picture Piano", "Movie
Machine", "Shadow Canvas", "Interactive
Bed". Displayed at the Hague Summer Festival June 11 to 19,
1988.
Stills from the video "Long Night"
used in the "Interactive Bed" installation.
........................................
Click HERE
to watch the intro of the "Long Night" video.
(616KB, Shockwave
plug-in required)
........................................
Cover
for the catalog for the "Garden of Interactive
Delights."
Notes
on the "Garden of Interactive Delights."
Notes
on the "Interactive Bed."
Newspaper
coverage of the "Garden of Interactive Delights."
More
newspaper coverage of the "Garden of Interactive
Delights."
Catalog
from the exhibition and presentation of "Interactive
Bed" at the American Film Institute (AFI) 1988.
Discussion
of "Interactive Bed" at AFI 1988 page 1.
Discussion
of "Interactive Bed" at AFI 1988 page 2.


Preparation time
overnight
Cooking time
10 to 30 mins
Serves
Serves 8
Dietary
Pair sweet meringue with tart blackberrys for a wonderful dessert.
For the meringue base, preheat the oven to 140C/275F/Gas 1. Line a baking tray with baking parchment.
Whisk the egg whites in a clean glass or metal bowl until soft peaks form when the whisk is removed. Add the sugar, a spoonful at a time, and continue to whisk until firm peaks form when the whisk is removed and the mixture is glossy. Whisk in the cornflour and vinegar.
Place tablespoonfuls of the mixture onto the lined baking tray and bake in the oven for 10 minutes. Turn the oven off and leave the meringues in the oven with the door closed for 2-3 hours, or preferably overnight, until crisp but uncoloured.
Meanwhile, for the blackberry parfait, blend the blackberries, custard and lemon juice to a purée in a food processor. Gently fold the purée into the whipped cream until well combined.
In a separate bowl, whisk the egg whites until soft peaks form when the whisk is removed, then gradually add in the caster sugar, whisking continuously until glossy, stiff peaks form. Fold half of the egg whites into the blackberry mixture until well combined, then carefully fold in the remaining egg whites until just combined.
Spoon the parfait into a 25cm/10in diameter x 5cm/2in high springform cake tin lined with cling film and tap the side lightly with a spoon to release any large air pockets.
Freeze the parfait for at least 4 hours, but preferably overnight, until solid.
For the Italian meringue topping, heat the sugar and water in a saucepan until the mixture reaches 110C/230F on a sugar thermometer. (CAUTION: Boiling sugar syrup can be dangerous. Do not leave unattended.)
Meanwhile, using an electric whisk, whisk the egg whites and lemon juice in a clean glass or metal bowl until firm peaks form when the whisk is removed.
As soon as the sugar syrup reaches 121C/250F, remove the pan from the heat.
Immediately resume whisking the egg whites. With the whisk set to its lowest speed, pour in the sugar syrup in a steady stream. (CAUTION: Keep the syrup clear of the beaters as hot syrup could splash back onto your hands.) Continue whisking for 4-5 minutes, until the mixture is slightly cooled. Spoon the meringue into a piping bag fitted with a teardrop-shaped nozzle.
For the blackberries, fry the butter and blackberries in a non-reactive frying pan over a high heat for 1-2 minutes, or until just softened. Add the blackberry liqueur. Carefully set the liqueur alight with a kitchen match. Allow the flames to flare up and die down, then continue to cook for a further minute.
To serve, crumble some of the crisp meringue base into the centre of each of eight plates. Using a hot knife, cut eight slices of blackberry parfait and place one on top of each serving of meringue. Pipe some Italian meringue onto the top of the parfait. Using a cooks' blow torch, brown the tops of the meringue. Spoon some warm blackberries alongside and serve immediately.


Java™ Execution Time Measurement Library
Runtime performance monitoring made easy
JETM Changelog
Release 1.2.2
New features - First revision TabularData in JMX Beans (recommended by Nat Luengnaruemitchai) - (Undocumented) JBoss AOP Support (target release will be JETM 1.3.0) - Experimental JETM Connector for .ear deployment (target release will be JETM 1.3.0) Changes, Fixes and Improvements - Switched back to non Thread Context Classloader resource loading - Fixed possible NullPointers in MonitoringBeanDefinitionParser (reported by Nat Luengnaruemitchai) - Fixed NullPointer in 1.2 XML configuration parsing for interval based monitoring - RFC 2616 compliant HTTP status response linefeeds (reported by Nat Luengnaruemitchai) - Clarified aop.xml requirement for AspectWerkz offline weaving - Fixed further documentation/javadoc errors
Release 1.2.1
New features - Dump current state to log file during reset - if dump plugin is active Changes, Fixes and Improvements - Removed blocking during EtmMonitor.render() - Improved locking during collection and aggregation - HTTP Console: Fixed average division by zero - HTTP Console: Fixed broken reset link in MeasurementPoint detailed view - HTTP Console: Aligned sort order for overview and detail view - HTTP Console: Switched to better resource loading - JETM Web Demo: Fixed wrong filter pattern for logging - JETM Web Demo: Removed Java 5.0 dependency - JETM Samples: Removed util namespace from 5 minute tutorial(#1706118) - Build and Test: Java 1.4 support
Release 1.2.0
New features - Improved Spring integration using Spring 2.x namespaces - Sort by name, executions and times in HTTP console - Switch collapsed/expanded mode in HTTP console during runtime - Added support for persistent aggregation results - Added HTTP console servlet for EtmManager and Spring Managed EtmMonitors - Activated JMX support (deprecated old JMX MBeans), now export top level performance results as JMX MBean - Simplified XML based configuration (use jetm_config_1_2.dtd therefore) - Added basic RRD4j support - Added EtmPluginMetadata - thus enabling lookup for runtime configuration such as HTTP Console listen port - Added Filter for aggregator chains. - Added event system - especially useful for plugins Changes, Fixes and Improvements - Five minute tutorial added - Documentation improvements - Deprecated Flat- and NestedAggregator in favour of one common RootAggregator - Deprecated MeasurementPoint in favour of EtmMonitor#createPoint() - Decreased EtmMonitor locking sections - Added setter for plugins for better Spring integration - Improved logging, now using log4j/java 1.4 logging if available (reverts to standard out if not) - Now writing warnings if monitor is not running - Reverted to shared java.util.Timer for scheduling - Minor fixes to logging aggregators - Altered startup order of plugin and aggregator - Added init(EtmMonitorContext) to plugin and aggregator lifecycle - Added system property support for jetm-config.xml - Switched from CVS to SVN (history not migrated)
Release 1.1.1
Changes, Fixes and Improvements - Switched to thread context classloader to load resources.
Release 1.1.0
New features - AspectWerkz Support - Generic Web App Integration Support - Expanded/Collapsed HTTP Console result rendering - Dump on shutdown plugin Changes, Fixes and Improvements - robots.txt for HTTP console added (disabled actions) - EtmManager.getEtmMonitor() now returns a proxy, this allows late EtmMonitor init. - Removed auto referesh in HTTP console - Added reset(MeasurementPointName) to EtmMonitor - Improved SimpleTextRenderer layout - Logging aggregators now support filtering
Release 1.0.0
New features - Spring based demo (currently available online only) Changes, Fixes and Improvements - Javadoc cleanup - Fixed logging aggregator bugs
Release 0.8.0
New features - Enabled Plugin Support for XML Configuration - Added HTTPConsoleServer Plugin Changes, Fixes and Improvements - EtmMonitor instances have now two states (required for plugin mechanism) - HTTPConsoleServer Startup Thread fixes. - Minor layout changes in SimpleHtmlRenderer - Autostart for EtmManager configurations
Release 0.7.0
New features - Added spring support - Added AOP Alliance support - Added log framework abstractions - Added log4j style configurators - Added drop-in HTTP console Changes, Fixes and Improvements - Removed StaticMeasurementPoint and MonitorFactory and switched to Log4J/Commons Loging type configuration for static monitoring - Improved online documentation, javadoc and examples - Aggregators now use mixed constructor/setter injection for required and optional dependencies - Minor API changes in monitor constructors - Moved BufferedTimedAggregator to core package - Moved Jdk14DumpAggregator to Jdk14LogAggregator (new package) - Temporary disabled JBoss support
For changelog prior to 0.7.0 see CVS


DEEP VALLEY (director: Jean Negulesco; screenwriters: Stephen Morehouse Avery/Salka Viertel/from book by Dan Totheroh; cinematographer: Ted D. McCord; editor: Owen Marks; cast: Ida Lupino (Libby Saul), Dane Clark (Barry Burnette), Ray Teal (Prison Official), Fay Bainter (Ellie Saul), Wayne Morris (Jeff Barker), Clancy Cooper (Prison Guard), Henry Hull (Cliff Saul), Willard Robertson (Sheriff Akers); Runtime: 104; Warner Bros.; 1947)
Reviewed by Dennis Schwartz
A slow paced, b&w, atmospheric melodrama, set in the mountains of northern California, about a farm girl, Libby Saul (Ida Lupino), romanced by an escaped convict, Barry Burnette (Dane Clark). One character says of the farm, it is in such a remote spot, even the coyotes don't come here.
Libby has felt imprisoned, leading a sheltered and unhappy life with her miserable folks. Ellie Saul (Bainter), her mother, hasn't left her room for years, she is so embittered over her marriage that she refuses to even talk with her husband. Her father Cliff (Hull), is an angry man, showing no love to his wife or stuttering daughter. It's a marriage consumed by hate.
The 22-year-old Libby has enough of this and runs away to her secret hideaway cabin in the woods, on the night of a big rainstorm, taking her faithful dog Joe with her. There is a new coastal highway being built with the help of a chain gang crew, which is going through her Big Sur forest region. One of the convicts, Barry Burnette, escapes during the severe rainstorm.
The two runaways meet in her cabin and fall in love. Barry explains how his quick temper always spelled trouble for him, and got him convicted of manslaughter when he held up a jewelry store and killed the employee, though he was too drunk to remember if he actually did it.
Libby exclaims that this is the first happy day she has ever had, as they catch a trout and kiss, spending the night together. They make plans to get to San Francisco and live together, but separate as she goes back home to get food and a change of clothes for him.
The search party gets into a shootout with him at Stone Ridge, but he escapes and returns to hide in her farmhouse barn.
On her return, things change at home, as her parents get together and act civilized for the first time that she could remember. They also notice that she's glowing with happiness and figure it's because she met the road engineer, Jeff Barker (Wayne Morris), who expresses a keen interest in her, and has even made plans with her father to go partners in opening up a filling station once the road is completed.
The interesting part of the film revolves around the conflict Libby faces, of running away with the violent fugitive she has fallen madly in love with or have a secure marriage with a really nice man, the engineer, but who is someone she doesn't love.
"Deep Valley" offers a dramatic look at how love can make one feel alive again. The film comes to a boil with its very moving conclusion, after a very slow start.
The acting is first-rate, making these melodramatics seem realistic.
REVIEWED ON 2/22/2001 GRADE: B-
Dennis Schwartz: "Ozus' World Movie Reviews"
http://www.sover.net/~ozus
<EMAIL_ADDRESS>© ALL RIGHTS RESERVED DENNIS SCHWARTZ
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


|
DistributedRobotWorld
|
Classes | |
| class | GoalShape |
| class | LineShape |
| class | RectangleShape |
| class | RobotShape |
| class | RobotWorldCanvas |
| class | Shape |
| struct | ShapeData |
| class | ViewObject |
| class | WallShape |
| class | WayPointShape |
Typedefs | |
| typedef std::shared_ptr< RectangleShape > | RectangleShapePtr |
| typedef std::shared_ptr< Shape > | ShapePtr |
| typedef std::shared_ptr< RobotShape > | RobotShapePtr |
| typedef std::shared_ptr< GoalShape > | GoalShapePtr |
| typedef std::shared_ptr< WayPointShape > | WayPointShapePtr |
| typedef std::shared_ptr< WallShape > | WallShapePtr |
Enumerations | |
| enum | { ID_ABOUT, ID_ADD_ROBOT, ID_EDIT_ROBOT, ID_DELETE_ROBOT, ID_ADD_WAYPOINT, ID_EDIT_WAYPOINT, ID_DELETE_WAYPOINT, ID_ADD_GOAL, ID_EDIT_GOAL, ID_DELETE_GOAL, ID_ADD_WALL, ID_EDIT_WALL, ID_DELETE_WALL, ID_SHAPE_INFO, ID_WORLD_INFO } |
| typedef std::shared_ptr<GoalShape> View::GoalShapePtr |
| typedef std::shared_ptr<RectangleShape> View::RectangleShapePtr |
| typedef std::shared_ptr<RobotShape> View::RobotShapePtr |
| typedef std::shared_ptr< Shape > View::ShapePtr |
| typedef std::shared_ptr<WallShape> View::WallShapePtr |
| typedef std::shared_ptr<WayPointShape> View::WayPointShapePtr |


The Belicamp*The Words of Archangel Michael
It is his time
No one can stop him
The Belicamp-The Belicamp-The Belicamp
I smell death
And so it is, for this is your destiny
This sign is given
As it is for this land
So it is for this world
The pieces are placed together
For the prophecy to begin
The terrible time is upon us
Woe to the inhabitant of this land
Woe to those who live in this world
There is no escape
God the Father has made his play
God has chosen his way
Mankind has found his end
Only the Prophecy of the Magician can deliver the few
He comes by the light and the sky
And it is so saith the Lord
Call on the Father, Call on the Angels
Your cries fall on death ears
For this is the land of the dead
And it is so saith the Lord
For a great death comes from the sky
The Belicamp, the Belicamp, the Belicamp
Pray for the Lord and the Magician
For the Belicamp encircles them
The Father has sent the Belicamp to stop them
The Belicamp is the Demon of the Father
We walk along the river
I walk ahead and encounter the Belicamp
He stoops close to the ground and eats
New life has sprung from the ground
I am no more than twelve feet away
He eats next to the river and pays me no mind
I hear the Hourglass is almost empty