那你得看跟谁说。有的人生长于面食区,从小到大光吃面了,没咋吃过米,说不定还真比不过呢。
我们都知道,俗语是不能较真的。
但问题的关键是,我从小到大,每次我爹妈说不过我,他们就用这句话搪塞我!这让我一直忿忿不平!!
于是我还是一直梦想能有一天,我可以算出来他们到底是不是吃的盐比我吃的米还多,然后把结果拍他们脸上反驳回去。
然鹅,限于小学初中高中的我知识有限,我一直拿不出一个能令我爹妈信服的答案。
二十多年过去了,现在的我,已经在新中国的红旗下顺利成长成为了一个营养流行病学研究生。而巧合的是,我这门专业平时干的工作里,就有一部分是包括估计人们都吃些啥东西,每样东西都吃了多少。
因此!目前的我!终于具备这个知识储备和技术实力!对这个无聊的问题展开科学论证了!
讨论任何问题,如果要想得到一个清晰的结论,我们都得要先定义清楚问题是什么。
“爸妈吃的盐到底有没有比我吃的米多”,这句话里有4个物体需要清晰定义:
为了简化问题的讨论,我们这里直接定义:这个问题下面,“爸妈”就以已经为我的沙雕脑洞献身第N次的中国籍30岁轻体力活动男子,群众演员小张老师作为代表。
但鉴于后面马上他鹅几也会出场,我决定后面都叫他老张。
大家熟悉的盐,就是做饭的时候用勺子从盐袋子里舀进去的精制盐粒。但其实,如果论食盐的本质,也就是氯化钠,那来源可就多了去了。比如说,酱油里面就有氯化钠,豆瓣酱里面也有氯化钠,老干妈里面也有氯化钠;甚至除了这些调味品之外,几乎每一种食材,比如肉、菜、蛋等等,里面都含有钠离子和氯离子[1]。
为了避免爸妈后面一输了就狡辩说是没算上这些盐导致的,我们后面的计算就直接通过算总钠摄入量来反推氯化钠摄入量,这样能保证任何能算做“盐”的东西全都被算作盐。
让他们输个心服口服!
为了简化问题的讨论,我们这里直接定义:这个问题下面,“我”就是我们的群众演员老张的6岁鹅几,中国好少年小张。
通常意义下,“米”指的是精白米。但是这里我们有一个问题:北方的小孩们吃米比较少,吃面比较多。如果只算米,北方的孩子们不是亏死?再比如,如果只算米面,那人家主吃高粱的家里咋整?主吃小米的又咋整?
不过,仔细想想得话,俗语里面用了米,很可能是因为发明这条俗语的那位家长是个生活在南方吃米区的人。如果这条俗语是北方家长发明的,那么他为了实现同样的反差,很可能就会说“我吃的盐比你吃的面还多”。同理,如果他家主食是小米,他肯定也会说“我吃的盐比你吃的小米还多”。
所以,在这个问题下,我把“吃的米”定义成:吃谷类食物[1]的重量,也就是包含大米、小米、大麦、小麦、玉米等等一切粮谷类和用它们制作成的米饭、面条、米粉之类的加工品。这样一来,结论就能对南方北方都适用了!
即便是开脑洞,我们也得遵守基本法,应该给予我们两位自愿参与研究的被试以目前学术界研究得到的最理想最健康的对待。
在真空中的球形鸡式的理想情况下,为了坚定响应中华人民共和国卫生健康委员会的号召,积极参与“健康中国行动”,我们应该让老张的钠摄入(也就是我们要拿来反推氯化钠/食盐摄入量的那个指标),一毫克不差地严格遵守2013版《中国居民膳食营养素参考摄入量》[2]当中对每日(平均)钠摄入的建议量要求。
(我知道你们要说中国人实际上吃盐超标的多,没关系,后面的彩蛋分析有考虑了这个的,往下翻完!)
于是,根据此表,我们使用编程语言R,建立一个钠摄入计算的参考数据表:
#salt intake data sodium.intake= c(170,350,700,900,1200,1400,1600,1500,1400,1400,1300) age.low.Na= c(0, 0.5,1, 4, 7, 11, 14, 18, 50, 65, 80) age.high.Na=c(age.low.Na[-1],NA) salt.intake=sodium.intake*(23+35.5)/23/1000 Na.trait=data.frame(cbind(age.low.Na,age.high.Na,salt.intake,sodium.intake))
运行以上代码,可以得到这样一张包含了各年龄段该吃多少盐的数据表:
根据这个数据表,我们可以写一个函数计算老张截至任意年纪时的总钠摄入量:
#function:generic aggregated food intake calculation calc=function(obs.age,food.trait){ total.intake=numeric(length = length(obs.age)) age=numeric(length = length(obs.age)) age=obs.age #calculate fixed aggregated result for each age strata food.trait$strata.intake=rep(0,nrow(food.trait)) for (i in 1:nrow(food.trait)) { food.trait$strata.intake[i]=(food.trait[i,2]-food.trait[i,1])*food.trait[i,3]*365.25 } #calculate total intake for (i in 1:nrow(food.trait)) { total.intake[age>=food.trait[i,1] & age<food.trait[i,2]]=sum(food.trait$strata.intake[0:(i-1)])+(age[age>=food.trait[i,1] & age<food.trait[i,2]]-food.trait[i,1])*food.trait[i,3]*365.25 } return(total.intake) }
了解R编程的各位一定注意到了,本来这个过程是一个小学算术就能搞定的事,但这个函数写得非常通用(也因此看起来复杂了很多),可以基于任意参考值表计算出任意年龄下的任意食物摄入量。
这么写,是希望后面算小张的米的时候能够再次调用,以及……一个彩蛋分析。(哼我就是不在这说是啥!这么想知道的话就直接拉到最后!)
那么现在,我们通过告诉R老张有30岁,并且调用算盐的参考值表,来用刚刚写好的函数计算老张吃了多少盐。
calc(30,Na.trait)
R的运行结果如下:
所以,老张活了30岁到现在,如果一直听从党和国家的号召,坚持健康饮食,那么这三十年来他理论上一共吃了35729.55 g食盐。
对于小张吃了多少米这个问题,相似地,在真空中的球形鸡式的理想状况下,为了响应中华人民共和国卫生健康委员会的“健康中国行动”,我们也应该严格按照中国营养学会的《中国居民膳食指南》[3]当中的相关要求,给我们生在新中国长在红旗下的中国好少先队员小张同学以最健康的饮食安排。
由于0到6个月的婴儿应当坚持母乳喂养,因此严格遵守膳食指南的小张0到6个月期间没有吃过米。
7到24个月的婴幼儿,根据中国营养学会的7-24月龄膳食宝塔,每天应该摄入20-75g(7-12月龄)、50-100g(13-24月龄)的谷类。
其实照理说,这个时候的婴儿还只能吃碾碎的米糊,但是米碾成糊也是米!所以还是算作小张吃米了!
那么,由于婴儿添加辅食是一个逐步过渡的过程,不能一来就给他怼上75g,所以我们假设小张整个7-24月龄阶段平均下来谷类食用量线性增长,每天吃20g谷类和75g谷类的中间值,47.5g谷类。
而2岁以上的小张,就可以开始适用中国营养学会的《中国居民膳食指南》[3]中谷类部分的推荐量了:
同样地,对这张表里面的摄入范围,我们都假设小张老师吃的是取平均的中间值。那么,我们可以把前面的这些摄入参考量用这样的代码写进R:
#rice intake data crop.intake=c(0,(20+75)/2,(50+100)/2,(85+100)/2,(100+150)/2,(150+200)/2,(225+250)/2,(250+300)/2,(200+300)/2,(200+250)/2) age.low.crop=c(0,0.5,1,2,4,7,11,14,18,65) age.high.crop=c(age.low.crop[-1],NA) rice.intake=crop.intake rice.trait=data.frame(cbind(age.low.crop,age.high.crop,rice.intake,crop.intake))
运行上述代码,可以得到这样一张包含各年龄阶段该吃多少米的参考数值表:
接下来,我们要像算老张的盐那样,用这张表的信息算小张到今天满六岁为止一共吃了多少谷类。
我们直接调用前面写好的函数,将“小张的岁数是6岁”和“他吃的是米”这两个信息告诉我刚刚写的那个复合的函数:
calc(6,rice.trait)
R的运行结果如下:
于是我们知道了,截至小张6岁生日那天,小张吃了194952.2g谷类。
将近400斤!!!
老张可怜兮兮的七十来斤盐摄入量,在这庞大的优势面前,根,本,不,堪,一,击。
于是我们可以得到结论了:如果老张在他30岁那年的时候告诉6岁的小张说“我吃的盐比你吃过的米要多”,那么他是在胡说。
以上。
从小到大,我们都反复地被数学老师教育,不要一天到晚为了几个特殊值算出来的数字沾沾自喜,我们要的是通解!
说到通解,有没有想起来我前面写的那个函数?
是的,我之所以把它写成了面向向量的函数,就是因为要允许R用它作一个区间内的连续的函数图像呀!
啊哈哈哈哈哈哈,噫嘻嘻嘻嘻嘻嘻嘻,噢嚯嚯嚯活活活活~~~~
让我们用这些咒语(划掉)命令R里面把父子俩的盐摄入量和谷类摄入量画个图出来……
curve(calc(son.age.trans,rice.trait),xname = "son.age.trans",from=0,to=6,xlab = "son's age (father's age minus 24)",ylab = "aggregated intake",lty="solid",col="#0084ff",lwd=2) curve(calc(dad.age+24,Na.trait),xname = "dad.age",from=0,to=6,add = T,lty="solid",lwd=2,col="#8590a6") legend("topleft", legend = c("father's salt intake", "son's rice intake"),col = c("#8590a6", "#0084ff"), lty = 1:1, cex = 0.8)
R收到命令之后,画出了这样的一张图:
在这张图里,蓝线是小张的谷类摄入总量,灰线是老张的盐摄入总量。横轴是小张的年龄,同时也是老张的年龄减去24的数值。
因此,这张图体现的是:自小张降生以来,老张小张父子俩吃盐和吃谷类的龟兔赛跑的实时战况!
可以看到,虽然老张在24岁迎接小张的时候积累了高达两万七的先发优势……
但由于小张吃谷类的速度是如此的快……
他那点先发优势,在小张还没长到两岁的时候,就已经被追平了。
而且,由于小张每天吃谷类的速度远快于老张吃盐的速度,2岁一过,老张吃的这点盐的量,就被小张的谷类甩得尾灯都看不见了。
儿子不到两岁就不能用这招了,这是啥概念?这意味着,在你儿子能听懂你这句话啥意思之前,你就已经不能这么说了!
但是,家长代表老张仍然向我表示了他的不服。
“你安排我24岁就生小张,这也太早了点吧!要是我42岁老来得子,多积累十八年优势,怎么也能再在我儿子面前多装几年逼吧?”
嗯,既然你非要这么说的话,那就让我们按照你的要求再来比一次……
R代码略作小修,管上:
curve(calc(son.age.trans,rice.trait),xname = "son.age.trans",from=0,to=6,xlab = "son's age (father's age minus 24)",ylab = "aggregated intake",lty="solid",col="#0084ff",lwd=2) curve(calc(dad.age+42,Na.trait),xname = "dad.age",from=0,to=6,add = T,lty="solid",lwd=2,col="#8590a6") legend("topleft", legend = c("father's salt intake", "son's rice intake"),col = c("#8590a6", "#0084ff"), lty = 1:1, cex = 0.8)
作图的结果是这样的:
理想是美好的,现实是残酷的。
老张辛辛苦苦忍着不生鹅几,一直忍到42岁,18年啦!攒了整整五万多克的先发优势!!!
结果!也在鹅几两岁半的时候就消失了……
这意味着,老张晚生18年攒起来的五万克盐的优势,也只能让他在儿子小张面前多装不到一年大尾巴狼……
老张还是不服气:
“健康饮食”限制了我的吃盐能力!!我要吃到中国人目前的每天10g平均水平!!
须知,日均10g盐摄入(也就是大概3900mg钠摄入)的水平,已经算高的了。就目前而言,随便去翻本顶级医学杂志,那上面都会有一堆研究告诉你,吃这么多盐已经可能对健康有危害了[4]。
但是,既然老张想在儿子面前保持权威的心情急切,我们就违反一次受试者福利的要求,为他这么干一次吧。
我们再放弃要“健康饮食”这个假设,直接把老张的食盐量乘以2.5,达到目前文献中报道的可能对健康有害的中国成年人人均10g盐水平:
Na.deadly.trait=data.frame(cbind(age.low.Na,age.high.Na,salt.intake)) Na.deadly.trait$salt.intake=Na.deadly.trait$salt.intake*2.7
在这种情况下,豁出命来也要装大尾巴狼的42岁的老张,可以在儿子面前说他吃的盐比他儿子吃的米更多,一直到……
……也只能一直说到儿砸上小学之前。
看到这个结果,老张还是不满意:
现在的结果里面,我儿子吃什么杂七杂八的都算到谷类里边!要是只算吃的大米,我肯定能一直教育他到大学成年!!
对于他这样的想法,我们也不说多了,就直接把小张吃的谷类砍一半算作大米食量吧:
rice.unfair.trait=data.frame(cbind(age.low.crop,age.high.crop,rice.intake)) rice.unfair.trait$rice.intake=rice.unfair.trait$rice.intake*0.5
在这样强大的作弊条件下,42岁、不要命地每天齁死自己也要多吃盐的老张,只算儿子吃的大米,终于能再多说一段时间这句话……
……但,也只能一直说到鹅几八岁多的时候,也就是小学三年级的时候。
顺便,老张,再给你补一刀:
我搜了一下,Google告诉我说地球上的长寿记录目前是122岁。
虽然你基本不可能活到122岁,但我在这给你把挂开足了,让你以开挂吃盐的不健康生活方式强行活到122岁,这个时候你一共吃的盐的重量是:414022.4g。
而,你鹅几只需要长到10岁,他吃的米的重量就能达到432364.7g了,超过你活了一百二十二年每天齁死自己吃的盐了:
——19.07.19 15:24(GMT+1时区,夏令时)更新——
很多观众朋友都在呼吁用粒数再算一遍。
作为一个研究营养流行病学的硕士生,我的学术训练告诉我,学术意义上,好的做法应该是自己称一堆米和盐,然后数粒数除下来得到单粒重量。
但是!因为我的厨房秤没电了(辣鸡德国制造!!待机时长还不如我在中国用的made in China款),而且这也只是个知乎答案而不是写论文,所以我决定:
Google告诉我,盐的密度是2.16g/cm³。按照典型的盐粒大概0.5mm³见方的尺寸,一粒盐的重量大约是0.00027g。
而根据知友 @宽始 的手动测量,100粒米是2.1g,于是1粒米就是0.021g。
于是,我们把两个系数除下去,用最开始不作弊的24岁老张+健康饮食的假设写R代码如下:
curve(calc(son.age.trans,rice.trait)/0.021,xname = "son.age.trans",from=0,to=2,add=T,xlab = "son's age (father's age minus 24)",ylab = "granules",lty="solid",col="#0084ff",lwd=2) curve(calc(dad.age+24,Na.trait)/wt.salt.granule,xname = "dad.age",from=0,to=2,add = F,xlab = "son's age (father's age minus 24)",ylab = "granules",lty="solid",lwd=2,col="#8590a6") legend("topleft", legend = c("father's salt granules", "son's rice granules"),col = c("#8590a6", "#0084ff"), lty = 1:1, cex = 0.8)
得到新的图:
为啥这图里没有代表小孩米摄入量的蓝线了呢?
因为它太矮了,比灰线的最小值还低了一个数量级,已经低得看不见了。。。
所以,论吃盐的颗粒数,老张的盐颗粒数确实一直高于小张的米颗粒数。
我仿佛已经听到了老张的欢呼声。
当34岁的老张跟10岁的鹅几小张说:“看见没,按照颗粒数,我这辈子吃过的盐都比你吃过的米还多”的时候,其实小张也可以说:“按照颗粒数的话,我活到十岁吃的盐也比你活了三十四年吃过的米还多啊!你这三十四年又是怎么活的??”
不是我瞎编,有R的函数图像作证。假设仍然不变,只是吃盐的换成小张,吃米的换成老张:
curve(calc(son.age,Na.deadly.trait)/wt.salt.granule,xname = "son.age",from=0,to=15,xlab = "son's age (father's age minus 24)",ylab = "granule num.",lty="solid",col="#0084ff",lwd=2) curve(calc(dad.age+24,rice.unfair.trait)/0.021,xname = "dad.age",from=0,to=15,add = T,lty="solid",lwd=2,col="#8590a6") legend("topleft", legend = c("father's rice granule", "son's salt granule"),col = c("#8590a6", "#0084ff"), lty = 1:1, cex = 0.8)
可以看到,小张的吃盐量在8岁左右的时候就超过了老张!
这是我看到的最准确的总结。
总的来说,就是中国的高考相对公平,所以性价比极高,所以其他活动都可以适当让步。