在R中计算数据集平均中心与标准距离并绘图的问题
问题
我有一个名为mypoints的数据集,已编写代码完成数据读取、多边形创建和点绘制,代码如下:
mypoints = read.csv("d:\\data\\venus.csv", header = T) mypoints minx = min(mypoints[,1]) maxx = max(mypoints[,1]) miny = min(mypoints[,2]) maxy = max(mypoints[,2]) mypolygon = cbind(c(minx, maxx, maxx, minx), c(miny, miny, maxy, maxy)) plot(mypoints) polygon(mypolygon)
现在需要编写函数计算该数据集的平均中心与标准距离,并绘制以平均中心为圆心、标准距离为半径的圆。我尝试的代码如下:
# 计算x和y的平均中心 x1 = sum(mypoints[,1])/length(mypoints[,1]) y1 = sum(mypoints[,2])/length(mypoints[,2]) # 计算标准距离 sd.mypoints = sqrt(sum(x1+y1)/n) # 绘制圆 symbols(sd.mypoints[1], sd.mypoints[2], sd.mypoints$sd, add=T, inches=F)
运行绘制圆的代码时出现错误:
Error in sd.mypoints$sd : $ operator is invalid for atomic vectors
我已完成该数据集的最近邻、KDE、Ghat和Fhat分析,但在此问题上卡壳,求解决方法。
解决方法
1. 修正平均中心计算(可简化)
平均中心的计算可以用mean()函数更简洁,结果和你手动求和的方式一致:
mean_x = mean(mypoints[,1]) mean_y = mean(mypoints[,2])
2. 修正标准距离公式
你使用的标准距离公式不符合空间统计的定义,正确的标准距离公式为:
$$SD = \sqrt{\frac{\sum_{i=1}^n (x_i - \bar{x})^2 + \sum_{i=1}^n (y_i - \bar{y})^2}{n}}$$
对应R代码:
n = nrow(mypoints) sd_dist = sqrt( (sum( (mypoints[,1] - mean_x)^2 ) + sum( (mypoints[,2] - mean_y)^2 )) / n )
3. 修正绘制圆的代码
symbols()函数的参数格式错误,之前的sd.mypoints是单个数值(原子向量),无法使用$操作符和索引。正确用法是传入圆心坐标和半径:
# 先执行你的原始绘图代码 plot(mypoints) polygon(mypolygon) # 标记平均中心(可选) points(mean_x, mean_y, pch = 19, col = "red") # 绘制标准距离圆 symbols(mean_x, mean_y, circles = sd_dist, add = TRUE, inches = FALSE, col = "blue", lwd = 2)
4. 封装成可复用函数
把所有逻辑封装成函数,方便后续调用:
calculate_and_plot_center_sd <- function(data) { # 计算边界多边形 minx = min(data[,1]) maxx = max(data[,1]) miny = min(data[,2]) maxy = max(data[,2]) mypolygon = cbind(c(minx, maxx, maxx, minx), c(miny, miny, maxy, maxy)) # 绘制原始点和多边形 plot(data, main = "平均中心与标准距离圆") polygon(mypolygon, border = "gray") # 计算平均中心 mean_x = mean(data[,1]) mean_y = mean(data[,2]) # 计算标准距离 n = nrow(data) sd_dist = sqrt( (sum( (data[,1] - mean_x)^2 ) + sum( (data[,2] - mean_y)^2 )) / n ) # 添加平均中心标记和圆 points(mean_x, mean_y, pch = 19, col = "red") symbols(mean_x, mean_y, circles = sd_dist, add = TRUE, inches = FALSE, col = "blue", lwd = 2) # 返回计算结果 return(list(mean_center = c(x = mean_x, y = mean_y), standard_distance = sd_dist)) } # 调用函数 result = calculate_and_plot_center_sd(mypoints) # 查看结果 print(result$mean_center) print(result$standard_distance)
错误原因说明
- 标准距离公式错误,导致
sd.mypoints是单个原子向量,而非数据框,因此$sd操作符无效。 symbols()绘制圆时,未正确指定circles参数传递半径,误用了索引和$操作符。
内容的提问来源于stack exchange,提问作者SMC
相关产品推荐
相关产品推荐

