通过分类变量从新数据框中提取斜率?

时间:2019-07-22 22:02:07

标签: r gradient lm

我有一个数据集,描述了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散点图,所以我原则上认为格式应该可以吗?

BMI year scatter plot

非常感谢您的帮助。 如果很重要,稍后我想将slope函数作为dplyr group_by的一部分,但这将放在单独的帖子中(为了清晰起见,我决定将问题分解到不同的帖子中)。

1 个答案:

答案 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]])