我有一个数据集,描述了38年(1980年至2008年)内199个国家的BMI变化。数据本来是很宽的格式,我(我想)整理了一下:
BMI <- read.csv("Indicator_BMI female ASM.csv", header = TRUE)
BMI2 <- gather(BMI, "year", "BMI", X1980:X2008)
BMI2$year <- as.numeric(BMI2$year)
BMI <- BMI2
直到它最终以这种格式出现:
Country Year BMI
Afghanistan X1980 20.443
Afghanistan X1981 20.477
Afghanistan X1982 20.523
...
Albania X1980 25.174
Albania X1981 25.191
.......
Algeria X1980 20.241
.....
等,你明白了。
我想要做的是,对于每个国家,获取Year与BMI之间关系的斜率的梯度。
首先,我非常简单地尝试一次提取一个国家/地区的坡度:
thefit <- lm(BMI ~ year, subset(BMI, Country == "Albania"))
gradientAlbania <- round(coef(thefit)[2],4)
但是仅lm的输出是非常意外的(仅分别截取每年的截距):
Coefficients:
(Intercept) yearX1981 yearX1982 yearX1983 yearX1984 yearX1985 yearX1986 yearX1987 yearX1988 yearX1989 yearX1990
25.17427 0.01661 0.02605 0.04479 0.04932 0.03830 0.03512 0.01491 -0.00462 -0.02057 -0.03550
yearX1991 yearX1992 yearX1993 yearX1994 yearX1995 yearX1996 yearX1997 yearX1998 yearX1999 yearX2000 yearX2001
-0.12757 -0.20812 -0.23869 -0.23865 -0.23721 -0.20784 -0.20673 -0.17207 -0.11173 -0.04630 0.02905
yearX2002 yearX2003 yearX2004 yearX2005 yearX2006 yearX2007 yearX2008
0.09655 0.15771 0.22377 0.29098 0.35901 0.41967 0.48299
我猜想这与数据帧的格式有关(例如我无法摆脱的一年前的X。) 尽管我成功地按国家/地区创建了该数据的BMI〜year散点图,所以我原则上认为格式应该可以吗?
非常感谢您的帮助。 如果很重要,稍后我想将slope函数作为dplyr group_by的一部分,但这将放在单独的帖子中(为了清晰起见,我决定将问题分解到不同的帖子中)。
答案 0 :(得分:0)
正如@aosmith所提到的,您需要去除那些“ X”。
这是否可以处理您的数据并完成您想要的操作:
BMI <- read.csv("Indicator_BMI female ASM.csv", header = TRUE)
BMI2 <- gather(BMI, "year", "BMI", X1980:X2008)
BMI2$year <- as.numeric(gsub('X',"",BMI2$year))
# Adapted from "R for Data Science"
country_model <- function(df){
lm(BMI~year, data = df)
}
BMI2 %>%
group_by(country) %>%
nest() %>%
mutate(model = map(data, country_model)) %>%
mutate(slope = model[[1]][[1]][[2]])