基本的地理加权回归

时间:2017-03-11 17:16:40

标签: r regression qgis

我熟悉QGIS,但在这里与R斗争,我想帮助做一个基本的地理加权回归,其中一些数据基于纽约市的PUMA shapefile的质心点(55分,每个PUMA一个,这基本上就像一个大的人口普查区。)

这是我在csv中的数据: https://www.sendspace.com/file/pj48b5

另外,如果需要(可能不是),这里是shapefile数据: https://www.sendspace.com/file/wbqrpb

如您所见,该表格式如下:

lat         lng         variable_a  2015_median 9_yr_change 9_yr_change_new pc_change
40.8912378  -73.9101365 6           1200        380         480             31.6666666667
40.8901905  -73.8614272 8           1100        280         200             25.4545454545
40.8502191  -73.8050669 11          1100        300         530             27.2727272727
40.8561725  -73.8525618 2           1100        320         205             29.0909090909

如果我对两个变量进行基本回归,那么:

fit <- lm(variable_a ~ X9_yr_change_new, data=s_data)
summary(fit)

然后我得到一个0.4平方的R平方

我接下来要做的是测试相同的两个变量,但是通过使用lat和lng变量(质心的坐标)来查看这些点的地理接近度是否存在更强的关系被考虑在内。

有人能告诉我在QGIS或R中最简单的方法吗?

1 个答案:

答案 0 :(得分:2)

对于加权回归,您必须首先根据位置找到权重。可以通过对variable_a的每个组的lat/lng响应取平均值来计算,并计算每个组中的响应数。此number将成为ave_var_a的平均响应的权重。然后将weights = number传递给lm函数进行加权回归。

由于您的数据每个位置只有一个响应,因此未加权和加权回归的拟合结果是相同的。可以使用summary.aov()函数看到它。

我在下面显示未加权和加权回归。

设置加权数据:

df1 <- read.table(file = 's_data.csv', header = TRUE, sep = ',', stringsAsFactors = FALSE )
head(df1)
#        lat       lng variable_a X2015_median X9_yr_change X9_yr_change_new pc_change
# 1 40.89124 -73.91014          6         1200          380              480  31.66667
# 2 40.89019 -73.86143          8         1100          280              200  25.45455
# 3 40.85022 -73.80507         11         1100          300              530  27.27273
# 4 40.85617 -73.85256          2         1100          320              205  29.09091
# 5 40.84518 -73.88736         21          850          260              250  30.58824
# 6 40.86465 -73.90325          2         1000          230              300  23.00000

library(data.table)
setDT(df1)

df1[, 
    j = `:=` (number   = .N,   # total number of responses per location
              ave_var_a = mean(variable_a)),  # average response per location
    by = c('lat', 'lng')]

head(df1)
#         lat       lng variable_a X2015_median X9_yr_change X9_yr_change_new pc_change number ave_var_a
# 1: 40.89124 -73.91014          6         1200          380              480  31.66667      1         6
# 2: 40.89019 -73.86143          8         1100          280              200  25.45455      1         8
# 3: 40.85022 -73.80507         11         1100          300              530  27.27273      1        11
# 4: 40.85617 -73.85256          2         1100          320              205  29.09091      1         2
# 5: 40.84518 -73.88736         21          850          260              250  30.58824      1        21
# 6: 40.86465 -73.90325          2         1000          230              300  23.00000      1         2

执行lm未加权和加权回归:

# unweighted regression
fit <- lm( variable_a ~ X9_yr_change_new, data= df1 )
summary.aov(fit)
#                    Df  Sum Sq Mean Sq F value   Pr(>F)    
#   X9_yr_change_new  1 6537830 6537830   39.23 6.89e-08 ***
#   Residuals        53 8833855  166677                     
# ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# weighted regression
weighted_fit <- lm( ave_var_a ~ X9_yr_change_new, data= df1, weights = number )
summary.aov(weighted_fit)
#                    Df  Sum Sq Mean Sq F value   Pr(>F)    
#   X9_yr_change_new  1 6537830 6537830   39.23 6.89e-08 ***
#   Residuals        53 8833855  166677                     
# ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1