{"action":"created","issue":{"url":"https://api.github.com/repos/inaturalist/inaturalist/issues/530","labels_url":"https://api.github.com/repos/inaturalist/inaturalist/issues/530/labels{/name}","comments_url":"https://api.github.com/repos/inaturalist/inaturalist/issues/530/comments","events_url":"https://api.github.com/repos/inaturalist/inaturalist/issues/530/events","html_url":"https://github.com/inaturalist/inaturalist/issues/530","id":69883537,"number":530,"title":"Fiddling with improvements to counting IDs","user":{"login":"loarie","id":598026,"avatar_url":"https://avatars.githubusercontent.com/u/598026?v=3","gravatar_id":"","url":"https://api.github.com/users/loarie","html_url":"https://github.com/loarie","followers_url":"https://api.github.com/users/loarie/followers","following_url":"https://api.github.com/users/loarie/following{/other_user}","gists_url":"https://api.github.com/users/loarie/gists{/gist_id}","starred_url":"https://api.github.com/users/loarie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/loarie/subscriptions","organizations_url":"https://api.github.com/users/loarie/orgs","repos_url":"https://api.github.com/users/loarie/repos","events_url":"https://api.github.com/users/loarie/events{/privacy}","received_events_url":"https://api.github.com/users/loarie/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/inaturalist/inaturalist/labels/improvements","name":"improvements","color":"84b6eb"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":4,"created_at":"2015-04-21T15:54:51Z","updated_at":"2015-06-24T20:43:05Z","closed_at":null,"body":"We currently count IDs as #IDs made for others. A problem is that this gives equal weight to confirming agrees or coarse rank IDs as it does for IDs that actually add new information. Here I'm fiddling with a now way to count IDs that better reflects novel contributions.\r\n\r\nI've broken down a user's IDs into 5 groups:\r\n1) 'novel' IDs as all active IDs where the ID was the earliest ID to equal the observation's community ID\r\n2) 'confirming/coarse' IDs as are all active IDs where the ID was not the earliest ID to equal the observation's community ID\r\n3) 'no_cid' which includes all active IDs on observations that don't yet have a community ID because they are too young or esoteric\r\n4) 'dissents' which are all active IDs that don't match the observation's community ID\r\n5) 'inactive' which are inactive IDs usually because they change their minds or taxon changes\r\n\r\nHere's how I'm fetching my novel IDs:\r\n`SELECT count(*)\r\nFROM identifications i\r\nINNER JOIN observations ON (i.observation_id = observations.id)\r\nWHERE i.current = true\r\nAND i.user_id = 477\r\nAND observations.community_taxon_id = i.taxon_id\r\nAND i.created_at = (select MIN(created_at) \r\n       from identifications i2 where i2.observation_id = i.observation_id);`\r\n\r\nThis graph shows the breakdown of a few users categories:\r\n![screen shot 2015-04-21 at 8 38 22 am](https://cloud.githubusercontent.com/assets/598026/7256385/9c66d05a-e803-11e4-8229-76034417971f.png)\r\n\r\nThe top 10 IDers counting by # of 'novel' IDs are: \r\nfinatic (10285) => 19955\r\ngreglasley (9706) => 12933\r\nmaractwin  (10787) => 10466\r\nkueda (1) => 10059\r\nloarie (477) => 9921\r\njmaughn (2873) => 7764\r\ndpom (16101_ => 7156\r\njon_sullivan (1115) => 7061\r\nmuir (1000) => 6667\r\nsea-kangaroo (2991) => 6610 \r\n\r\nAnd in terms of number of taxa they've been able to ID by counting # of 'novel' IDs are:\r\nloarie (477) => 3581\r\nkueda (1) => 3310\r\nmaractwin (10787) => 2337\r\nfinatic (10285) => 2204\r\ngreglasley (9706) => 2203\r\ncarmelo_lopez (15211) => 2162\r\nsea-kangaroo (2991) => 2030\r\njon_sullivan (1115) => 1781\r\njaykeller (27743) => 1747\r\nrobberfly (13979) => 1607\r\n\r\nThe way I've done it here, 'novel' IDs include a user's own IDs as long as they were the first to get to whatever the community ID is. So this isn't a great metric of altruism, but it is a good metric of whether and what people actually know how to ID. \r\nHere's the same graph from above using only IDs on other people's stuff:\r\n![screen shot 2015-04-21 at 8 38 45 am](https://cloud.githubusercontent.com/assets/598026/7256394/b367897a-e803-11e4-9c3f-3c961450eca9.png)\r\n\r\nHere's the top 10 'novel' IDers and species count from novel IDs just for IDs on other people's stuff:\r\n\r\n'Novel' IDers:\r\nloarie (477) => 5561\r\nd_kluza (13200) => 3417\r\nkueda (1) => 3060\r\njohn8 (11060) => 2556\r\naztekium (16744) => 2113\r\nmaractwin (10787) => 2089\r\nsambiology (22589) => 1388\r\nannemirdl (7504) => 1296\r\njakob (5643) => 1295\r\njon_sullivan (1115) => 1259\r\n\r\nSpecies count from novel IDs:\r\nloarie (477) => 2436\r\nkueda (1) => 1532\r\nd_kluza (13200) => 1132\r\njohn8 (11060) => 949\r\naztekium (16744) => 910\r\nmaractwin (10787) => 811\r\njon_sullivan (1115) => 749\r\nsambiology (22589) => 677\r\nmeurkc (5302) => 656\r\nrcurtis (4860) => 649  "},"comment":{"url":"https://api.github.com/repos/inaturalist/inaturalist/issues/comments/115005400","html_url":"https://github.com/inaturalist/inaturalist/issues/530#issuecomment-115005400","issue_url":"https://api.github.com/repos/inaturalist/inaturalist/issues/530","id":115005400,"user":{"login":"kueda","id":22691,"avatar_url":"https://avatars.githubusercontent.com/u/22691?v=3","gravatar_id":"","url":"https://api.github.com/users/kueda","html_url":"https://github.com/kueda","followers_url":"https://api.github.com/users/kueda/followers","following_url":"https://api.github.com/users/kueda/following{/other_user}","gists_url":"https://api.github.com/users/kueda/gists{/gist_id}","starred_url":"https://api.github.com/users/kueda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kueda/subscriptions","organizations_url":"https://api.github.com/users/kueda/orgs","repos_url":"https://api.github.com/users/kueda/repos","events_url":"https://api.github.com/users/kueda/events{/privacy}","received_events_url":"https://api.github.com/users/kueda/received_events","type":"User","site_admin":false},"created_at":"2015-06-24T20:43:05Z","updated_at":"2015-06-24T20:43:05Z","body":"I like this as a way of incentivizing what you've described as novel identifications. I might propose this renaming, though:\r\n\r\n1. <s>'novel'</s> **lead** IDs as all active IDs where the ID was the earliest ID to equal the observation's community ID **[because \"novel\" suggests \"first\" or \"early\" to me]**\r\n1. '**confirming**<s>/coarse</s>' IDs as are all active IDs where the ID was not the earliest ID to equal the observation's community ID **[this means all active IDs where the ID mathces the CID AND is not the earliest, right?]**\r\n1. <s>'no_cid'</s> **novel** which includes all active IDs on observations that don't yet have a community ID because they are too young or esoteric **[\"putative\" or \"preliminary\" might be more accurate but also longer and more technical]**\r\n1. <s>'dissents'</s> **disagreeing** which are all active IDs that don't match the observation's community ID **[longer, but plainer]**\r\n1. 'inactive' which are inactive IDs usually because they change their minds or taxon changes\r\n\r\nTechnically, this would be a bit of a pain if we stored these statuses with the identifications, but I don't see a better way to do it. Every time a new identification was added we'd need to re-determine the type for each one, though frankly we already do something similar with active/inactive IDs. We'd also have to retroactively classify all observations.\r\n\r\nImplementation-wise, I'm think just adding a some kind of `idtype` string column to `identifications` that would be `novel` by default, but could also be `lead`, `confirming`, or `inactive`, and displaying these types on the list of identifications on obs/show, with the future intent of showing some of the kinds of stats @loarie has put together here. Does that sounds reasonable, @pleary, or do you think these things can be determined dynamically?\r\n"}}