我熟悉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中最简单的方法吗?
答案 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