【问题标题】:abline and logarithmic x-axis gives horizontal regression line in plotabline 和对数 x 轴在图中给出水平回归线
【发布时间】:2012-07-30 20:06:14
【问题描述】:

首先,请从http://alexandervanloon.nl/survey_oss.csv下载我的数据集,然后执行以下脚本内容得到几个散点图:

# read data and attach it
survey <- read.table("survey_oss.csv", header=TRUE)
attach(survey)

# plot for inhabitants
png("scatterINHABT.png")
plot(INHABT, OSSADP, xlab="Inhabitants", ylab="Adoption of OSS", las=1)
abline(lm(OSSADP~INHABT)) # regression line (y~x)
dev.off()

# plot for inhabitants divided by 1000
png("scatterINHABT_divided.png")
plot(INHABT/1000, OSSADP, xlab="Inhabitants", ylab="Adoption of OSS", las=1)
abline(lm(OSSADP~INHABT)) # regression line (y~x)
dev.off()

# plot for inhabitants in logarithmic scale
png("scatterINHABT_log.png")
plot(INHABT, OSSADP, xlab="Inhabitants", ylab="Adoption of OSS", las=1, log="x")
abline(lm(OSSADP~INHABT)) # regression line (y~x)
dev.off()

# plot for inhabitants in logarithmic scale and divided by 1000
png("scatterINHABT_log_divided.png")
plot(INHABT/1000, OSSADP, xlab="Inhabitants", ylab="Adoption of OSS", las=1, log="x")
abline(lm(OSSADP~INHABT)) # regression line (y~x)
dev.off()

如您所见,在第一个散点图中,问题是R 决定使用科学记数法,并且由于异常值,数据看起来很奇怪。这就是为什么我想让 x 轴上的居民以千为单位,并且 x 轴也使用对数刻度。

问题是双重的。首先,我可以通过简单地将居民除以 1000 来摆脱科学记数法,但这会产生与第一个图不同的平坦水平回归线。我知道还有其他方法可以解决此问题,例如 Do not want scientific notation on plot axis,但我无法根据我的情况调整那里的代码。

其次,将 x 轴切换为对数刻度也会使回归线变平。谷歌指出https://stat.ethz.ch/pipermail/r-help/2006-January/086500.html 作为可能解决方案的第一个结果,我尝试使用那里建议的abline(lm(OSSADP~log10(INHABT))),但这会产生垂直回归线。如果我将两者除以 1000 并使用对数刻度,这条线也是水平的。

我是一名社会科学家,没有任何数学和统计学背景,所以我担心我可能遗漏了一些明显的东西,如果是这样,我深表歉意。非常感谢大家的任何潜在帮助。

【问题讨论】:

    标签: r math graphics


    【解决方案1】:

    科学记数法在on the R mailing list 之前已经介绍过了,但是您可以通过options()$scipen 控制 R 选择何时使用科学记数法。

    options(scipen=10)
    plot(INHABT, OSSADP, xlab="Inhabitants", ylab="Adoption of OSS")
    

    其次,您除以 1000 的问题是您在 plotabline 中都没有除以一千。这样就可以了:

    plot(INHABT/1000, OSSADP, xlab="Inhabitants", ylab="Adoption of OSS")
    abline(lm(OSSADP~I(INHABT/1000))) # Fixed regression line.
    

    I 是必需的,因为/ 符号在formulas 中具有不同的含义。

    另外,您的las 参数是不必要的。

    【讨论】:

    • 非常感谢您的回答。我决定使用千分法并简单地用xlim=c(0,215) 排除三个异常值,这样就不需要对数刻度。但是,如果有人确实知道将此方法与对数 x 轴相协调的解决方案,请分享。
    • 哦,如果我不包括选项las=1,R 将垂直而不是水平显示 y 轴刻度的数字。
    【解决方案2】:

    我解决了像这样使用log="x"时出现水平线的问题:

    plot(INHABT, OSSADP, xlab="Inhabitants", ylab="Adoption of OSS", log="x")
    abline(lm(OSSADP~log10(INHABT)))
    

    log10 而不仅仅是log

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2012-09-17
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多